C# 重载基于返回类型的方法

C# 重载基于返回类型的方法,c#,return-value,overloading,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)se

全部-- 我的一个类中有两个方法:

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);
        }
    }
public static T反序列化fromXML(字符串路径XML)
{
T分贝;
使用(XmlTextReader=新的XmlTextReader(pathToXML))
{
XmlSerializer ser=新的XmlSerializer(typeof(T));
db=(T)序列反序列化(读取器);
}
返回分贝;
}
publicstaticvoidtoxml(tdb,stringpathToxml)
{
使用(var fileStream=newfilestream(pathToXML,FileMode.Create))
{
var ser=新的XmlSerializer(typeof(T));
序列化(文件流,db);
}
}
我想在搜查警察结束这个问题之前把这些贴出来

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

这根本不可能。重载解析过程中不考虑返回类型,该语言只是禁止尝试这样重载。根据C#4规范第3.6节:

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

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

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

  • 方法重载允许类、结构或接口声明具有相同名称的多个方法,前提是它们的签名在该类、结构或接口中是唯一的
就其动机而言,如果表达式的类型取决于表达式的使用方式,则会使生活变得非常复杂。对于某些表达式(例如
null
和lambda表达式)是这种情况,但对于方法调用等则不是这种情况。你可能会遇到一些非常奇怪的情况:

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

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

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

你不能这么做,因为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;
}
public static T反序列化fromXML(字符串路径XML)
{
T分贝;
使用(XmlTextReader=新的XmlTextReader(pathToXML))
{
XmlSerializer ser=新的XmlSerializer(typeof(T));
db=(T)序列反序列化(读取器);
}
返回分贝;
}
然后,您可以这样调用函数:

DeSerializeFromXml<cDatabases>(pathToXml);
反序列化fromXML(pathToXml);

虽然这并不是您想要的,但它的好处是只需要一个方法。

为什么不返回一个泛型对象呢?在这种情况下,您可能不需要重载。

编译器如何知道您试图调用的是哪一个?不,只有返回类型才可能不同。请参见:-一些有用的信息(相当多的一个)可能的Hans Passant Covariant返回类型与重载返回类型不一样。C++不支持以太,但是这里是如何在C++中做这是最好的方式去实现这种类型的功能-你也可以约束T,并用泛型来做一些非常强大的东西,比如约束到“新”等等。我用AutoPaulver LIB创建了一个基本映射器类,它为所有的对象提供默认的DTO映射,使用GyrasSe先生是一个天才!感谢您提供的简单解决方案。正如您所说,它是C#的一个属性。我记得Don Box在关于CLR的书中(Jon:)提到,CLR在技术上确实支持这种重载,但在我所知的任何语言中都没有实现。