我目前正在学习C#,有人告诉我,可以使用explicit关键字重载方法返回类型,但他从未解释过如何重载。我搜索了所有地方,也阅读了一些关于stackoverflow的问题和答案,但我没有发现这样的事情,而且,在大多数情况下,回答的人说不可能通过返回类型重载方法。在这一切之后,我开始认为没有这种可能性。现在有人真的知道如何通过使用explicit关键字来重载方法返回类型了吗?或者这是可能的吗?先谢谢你。
我认为你不能在返回类型上超载。返回类型不包括在方法签名中。编译器在检查返回值是否会在更大的上下文中导致错误(如果实际使用返回值)之前确定重载。
如果不使用返回值会发生什么。编译器将不知道使用什么重载。下面是一个这样的例子。
string func(int i){return "";}
int func(int i){return 0;}
void main(){
func(1);//what happens here??? which method gets called??
}
不能按返回类型加载。但是,您可以定义多个只因返回类型不同而不同的方法。这是两件不同的事情,常常是错误的。
显式关键字仅涉及运算符。我想这不是他的意思,你们中的一个也可能误用/误解了实际的术语。
他的意思可能是显式接口实现
。
这是唯一允许定义许多只因返回类型不同而不同的普通方法的方法(可能除了转换运算符,但它们有些特殊)。最常见的是GetEnumerator
,这是IEnumerable
和IEnumerable都需要的
public class Foo : IEnumerable<Bar>, IEnumerable
{
public IEnumerator<Bar> GetEnumerator() { return null; }
// IEnumerator GetEnumerator() { return null; } // IMPOSSIBLE
IEnumerator IEnumerable.GetEnumerator() { return null; }
}
请注意类Foo如何定义返回泛型迭代器的Get枚举器。通常情况下,现在不可能定义另一个将满足经典IENumatble的Get枚举器。
然而,通过最后一行,通过显式接口实现,这是可能的。请注意方法名称是如何以接口名称作为前缀的。
另外,要小心:所有显式实现都是私有的,这就是为什么它没有访问说明符的原因。这意味着,尽管成功地定义了它们,但您将无法在此基础上过载。除非将Foo转换为普通的IEnumerable,否则显式的一个将始终隐藏,并且永远不会使用。
所以:
Foo foo = ...; //
foo.GetEnumerator(); // calls normal typed GetEnumerator<>
((IEnumerable)foo).GetEnumerator(); // calls untyped GetEnumerator
警告:该规则也存在于班级的主体中,有时可能会产生误导:
public class Foo : IEnumerable<Bar>, IEnumerable
{
public IEnumerator<Bar> GetEnumerator() { return null; }
private void test()
{
// relatively obvious:
this.GetEnumerator(); // calls GetEnumerator<>() !
((IEnumerable)this).GetEnumerator(); // calls plain GetEnumerator()
}
IEnumerator IEnumerable.GetEnumerator()
{
// very inobvious:
return this.GetEnumerator(); // calls GetEnumerator<> ! no recursion!!
// ((IEnumerable)this).GetEnumerator(); // would call itself recursively
}
}
我有一个匿名函数,如下所示: 我想指定cb必须返回一个布尔值,但我是一个打字稿新手,不知道我是否可以(或者即使我这样做或不这样做会对解析器产生影响)。 我该怎么做?
我正在学习如何获取重载函数vs的返回值的。 我修改了SO答案中的代码(由chris编写)。 我有一个编译错误。 错误:“std::result\u of”中没有名为“type”的类型 据我所知:- >
有以下功能: 为了更准确,我使用Java中的泛型类型定义了返回的,即,但它不起作用,出现错误: 类型对象不可下标 问:是否有可能定义返回的与泛型类型?
问题内容: 为什么仅通过更改返回类型就不可能重载函数?将来的Java版本会改变吗? 顺便说一句,仅供参考,这在C ++中可能吗? 问题答案: 你无法在Java中做到这一点,也无法在C ++中做到这一点。基本原理是,仅返回值不足以使编译器确定要调用的函数:
问题内容: 我有一个模块分开的应用程序。有几个实体和CSV模块。CSV模块仅支持struct(Entity),但我想使CSV模块可与任何类型的实体一起使用。现在,它的工作方式如下:Csv模块从通道接收数据并将其严格转换为struct。我如何实现动态返回类型,因此它可以与任何类型的Entity一起使用,而不仅限于 问题答案: 快速/肮脏的解决方案: 返回接口{},但是您最终欺骗了编译器,而类型检查的