基于返回类型重载方法

时间:2012-06-26 21:36:57

标签: c# return-value overloading

全部 -        我在其中一个课程中有这两种方法:

public static void DeSerializeFromXml(out cDBData db, string pathToXML)
{
    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDBData));
        db = (cDBData)ser.Deserialize(reader);
    }
}

public static void DeSerializeFromXml(out cDatabases db, string pathToXML)
{
    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDatabases));
        db = (cDatabases)ser.Deserialize(reader);
    }
}

它们工作正常,但我想知道为什么我不能根据方法的返回类型创建方法重载。我以为我读到这可能在某个地方,但我显然是错的,因为它不起作用:

public static cDBData DeSerializeFromXml(string pathToXML)
{
    cDBData db;

    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDBData));
        db = (cDBData)ser.Deserialize(reader);
    }
    return db;
}

public static cDatabases DeSerializeFromXml(string pathToXML)
{
    cDatabases db;

    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDatabases));
        db = (cDatabases)ser.Deserialize(reader);
    }
    return db;
}

感谢您的深思熟虑的回复

感谢dlev​​,这是最终的解决方案

    public static T DeSerializeFromXml<T>(string pathToXML)
    {
        T db;

        using (XmlTextReader reader = new XmlTextReader(pathToXML))
        {
            XmlSerializer ser = new XmlSerializer(typeof(T));
            db = (T)ser.Deserialize(reader);
        }
        return db;
    }

    public static void SerializeToXml<T>(T db, string pathToXML)
    {
        using (var fileStream = new FileStream(pathToXML, FileMode.Create))
        {
            var ser = new XmlSerializer(typeof(T));
            ser.Serialize(fileStream, db);
        }
    }

我希望在搜索警察关闭此问题之前发布这些内容。

3 个答案:

答案 0 :(得分:6)

你不能这样做,因为C#根本不支持那种重载。您可以通过使方法通用并返回通用参数类型来实现类似的效果:

public static T DeSerializeFromXml<T>(string pathToXML)
{
    T db;

    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(T));
        db = (T)ser.Deserialize(reader);
    }
    return db;
}

然后您可以调用这样的函数:

DeSerializeFromXml<cDatabases>(pathToXml);

虽然这不是你想要的,但它确实只需要一种方法。

答案 1 :(得分:3)

  

我想知道为什么我不能根据方法的返回类型创建方法重载。

根本不可能。在重载解析期间不考虑返回类型,并且语言只是禁止尝试像这样重载。从C#4规范的第3.6节开始:

  

方法的签名包括方法的名称,类型参数的数量以及每个形式参数的类型和种类(值,参考或输出),按从左到右的顺序考虑。出于这些目的,在形式参数类型中出现的方法的任何类型参数不是通过其名称来标识,而是通过其在方法的类型参数列表中的序号位置来标识。方法的签名特别不包括返回类型,可以为最右边的参数指定的params修饰符,也不包括可选的类型参数约束。

请注意,此处包含 的返回类型。然后我们有:

  

签名是在类,结构和接口中重载成员的启用机制:

     
      
  • 方法的重载允许类,结构或接口声明具有相同名称的多个方法,前提是它们的签名在该类,结构或接口中是唯一的。
  •   

动机而言,如果表达式的类型取决于表达式的使用方式,则会使生命变得非常复杂。对于某些表达式(例如null和lambda表达式),此的情况,但不适用于方法调用等。你可能会遇到一些非常奇怪的情况:

public void Foo(int x) {}
public void Foo(long y) {}

public int Bar() {}
public long Bar() {}

Foo(Bar()); // What would this call?

答案 2 :(得分:0)

为什么不直接返回通用对象?在这种情况下你可能不需要重载。