为什么更多主流的静态类型语言不支持返回类型的函数/方法重载?我想不出那样做.通过参数类型支持过载似乎没有那么有用或合理.怎么这么不受欢迎呢?
programming-languages overloading language-design function-calls
[注意:这个问题的原始标题是" 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,int和Foo(这是一个类),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) 重复:函数重载按返回类型?
也许这是一个非常愚蠢的问题,但我不明白为什么我不能声明两个具有相同签名的方法,当它们具有不同的返回类型时.
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它的情况下也应该导致编译错误.
谁能看到我在这里做错了什么?我很高兴得到纠正.:-)
我有一种情况,我想从这个函数返回List <>
public DataTable GetSubCategoriesBySubCatID(Guid SubCategoryID)
Run Code Online (Sandbox Code Playgroud)
所以我想要的是
public List<SubCategories> GetSubCategoriesBySubCatID(Guid SubCategoryID)
Run Code Online (Sandbox Code Playgroud)
我知道仅基于返回类型不支持重载,我只是不想在两个函数中复制相同的代码.
什么是最好的方法来实现这一点,而不会影响第一个功能的参考
全部 - 我的一个课程中有这两种方法:
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)