您不能按返回类型超载。但是,您可以定义多个仅根据返回类型不同的方法。这是两件不同的事情,经常被误解。
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。通常,现在不可能定义另一个满足经典 IEnumeratble 的 GetEnumerator。
但是,通过最后一行,通过显式接口实现,这是可能的。请注意方法名称是如何以接口名称为前缀的。
另外,请注意:所有显式实现都是私有的,这就是它没有访问说明符的原因。这意味着,尽管成功定义了它们,但您将无法超载。除非您将 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
}
}