我目前正在学习c#,有人告诉我可以使用显式关键字重载方法返回类型,但他从未解释过如何重载。我到处搜索,并在stackoverflow上阅读了一些问题和答案,但我没有找到这样的事情,此外,在大多数情况下,回答的人说,不可能通过返回类型重载方法。在这一切之后,我开始认为没有这种可能性。有人知道如何重载方法返回类型吗通过使用显式关键字,或者这是可能的吗?提前谢谢你。
您不能通过返回类型重载。但是,您可以定义多个方法,它们只是返回类型不同。这是两件不同的事情,经常被误解。
explicit
关键字只与操作符相关。我想那不是他的意思,你们中的一个可能也会误用/听错实际的术语。
他可能指的是explicit interface implementation
。
这是唯一允许定义许多普通方法的方法(好吧,可能除了转换操作符,但它们在某种程度上是特殊的方法),这些方法只在返回类型上有所不同。最常见的是GetEnumerator
, IEnumerable
和IEnumerable<T>
都需要它:
public class Foo : IEnumerable<Bar>, IEnumerable
{
public IEnumerator<Bar> GetEnumerator() { return null; }
// IEnumerator GetEnumerator() { return null; } // IMPOSSIBLE
IEnumerator IEnumerable.GetEnumerator() { return null; }
}
注意类Foo如何定义返回泛型迭代器的GetEnumerator。通常,现在不可能定义另一个满足经典ienumerable的GetEnumerator。
然而,对于最后一行,通过显式接口实现,这是可能的。注意方法名是如何以接口名作为前缀的。
还要注意:所有显式实现都是PRIVATE的,这就是为什么上面没有访问说明符。这意味着,尽管成功地定义了它们,但您将无法在其上重载。显式的将永远被隐藏并且永远不会使用,除非你将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
}
}
我认为你不能重载返回类型。返回类型不包括在方法签名中。编译器在检查返回值是否会在更大的上下文中导致错误之前确定重载(这是在实际使用返回值的情况下)。
如果不使用返回值会发生什么。编译器将不知道要使用什么重载。下面就是这样一个例子。
string func(int i){return "";}
int func(int i){return 0;}
void main(){
func(1);//what happens here??? which method gets called??
}