相关疑难解决方法(0)

函数重载按返回类型?

为什么更多主流的静态类型语言不支持返回类型的函数/方法重载?我想不出那样做.通过参数类型支持过载似乎没有那么有用或合理.怎么这么不受欢迎呢?

programming-languages overloading language-design function-calls

248
推荐指数
5
解决办法
10万
查看次数

C#中的歧视联盟

[注意:这个问题的原始标题是" C#中的C(ish)风格联盟 ",但正如杰夫的评论告诉我的那样,显然这种结构被称为"歧视联盟"]

请原谅这个问题的冗长.

我们已经在SO中提出了几个类似的声音问题,但他们似乎专注于联盟的内存节约优势或将其用于互操作. 这是一个这样的问题的例子.

我希望有一个联合类型的东西有点不同.

我现在正在编写一些代码来生成看起来有点像这样的对象

public class ValueWrapper
{
    public DateTime ValueCreationDate;
    // ... other meta data about the value

    public object ValueA;
    public object ValueB;
}
Run Code Online (Sandbox Code Playgroud)

很复杂的东西,我想你会同意的.事情是,ValueA只能是几种特定类型(比方说string,intFoo(这是一个类),ValueB可以是另一小类.我不喜欢将这些值视为对象(我希望温暖舒适的感觉)编码有点类型安全).

所以我想写一个简单的小包装类来表达ValueA逻辑上是对特定类型的引用这一事实.我打电话给班级,Union因为我想要实现的目标让我想起了C语言中的联合概念.

public class Union<A, B, C>
{
    private readonly Type type; 
    public readonly A a;
    public readonly B b;
    public readonly C c;

    public A A{get {return a;}}
    public B B{get {return b;}}
    public C C{get …
Run Code Online (Sandbox Code Playgroud)

c# type-safety discriminated-union

83
推荐指数
5
解决办法
3万
查看次数

为什么即使返回类型不同,也不能使用相同的签名声明两个方法?

重复:函数重载按返回类型?


也许这是一个非常愚蠢的问题,但我不明白为什么我不能声明两个具有相同签名的方法,当它们具有不同的返回类型时.

public class MyClass
{
    private double d = 0;

    public double MyMethod()
    {
        return d;
    }

    public string MyMethod()
    {
        return d.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个编译错误,指出该类已经定义了具有相同参数类型的成员.

(显然,我在我的代码中使用它的方式并不像我的示例代码那么简单......但我认为它可以解决这个问题.)

我是否遗漏了有关OO设计的内容,这使得我正在尝试做一个OOP反模式?当然,编译器应该能够确定我尝试使用哪种方法,只要我具体告诉它我想要哪一种方法.

鉴于MyClass myClass = new MyClass();我希望以下代码可以工作:

double d = myClass.MyMethod();
string s = myClass.MyMethod();
Run Code Online (Sandbox Code Playgroud)

我希望以下代码有问题:

var v = myClass.MyMethod();
Run Code Online (Sandbox Code Playgroud)

但即使在var它的情况下也应该导致编译错误.

谁能看到我在这里做错了什么?我很高兴得到纠正.:-)

c# method-signature

4
推荐指数
2
解决办法
9329
查看次数

仅基于返回类型重载

我有一种情况,我想从这个函数返回List <>

public DataTable GetSubCategoriesBySubCatID(Guid SubCategoryID)
Run Code Online (Sandbox Code Playgroud)

所以我想要的是

public List<SubCategories> GetSubCategoriesBySubCatID(Guid SubCategoryID)
Run Code Online (Sandbox Code Playgroud)

我知道仅基于返回类型不支持重载,我只是不想在两个函数中复制相同的代码.

什么是最好的方法来实现这一点,而不会影响第一个功能的参考

c# overloading

4
推荐指数
1
解决办法
377
查看次数

基于返回类型重载方法

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
    } …
Run Code Online (Sandbox Code Playgroud)

c# overloading return-value

2
推荐指数
1
解决办法
243
查看次数