在C#中通过返回类型重载函数

时间:2014-07-16 10:44:19

标签: c# methods overloading explicit

我目前正在学习C#,有人告诉我,你可以使用explicit关键字实际重载方法返回类型,但他从未解释过如何。我遍布整个地方谷歌,并在stackoverflow上读了一些问题和答案,但是我找不到这样的事情,而且,在大多数情况下,回答的人说不可能通过返回类型重载方法。毕竟,我开始认为没有这种可能性。现在有人如何通过使用explicit关键字重载方法返回类型,或者甚至可能? 先感谢您。

2 个答案:

答案 0 :(得分:0)

我不认为你在返回类型上超载。返回类型不包含在方法签名中。编译器在检查返回值是否会在更大的上下文中导致错误之前确定重载(这是因为实际使用了返回值)。

如果您没有使用返回值会发生什么。编译器不知道要使用什么重载。一个这样的例子如下。

string func(int i){return "";}
int func(int i){return 0;}

void main(){
    func(1);//what happens here??? which method gets called??
} 

答案 1 :(得分:0)

您无法通过返回类型超载。但是,您可以定义多个仅由返回类型不同的方法。这是两件不同的事情,经常是错误的。

explicit关键字仅与运营商相关。我认为这不是他的意思,你们中的一个人也可能会滥用/误解实际的术语。

他的意思可能是explicit interface implementation

这是唯一的(好的,可能除了转换运算符,但它们有点特殊的方法),它们允许定义许多只有返回类型不同的普通方法。最常见的是GetEnumerator IEnumerableIEnumerable<T>令人恼火的public class Foo : IEnumerable<Bar>, IEnumerable { public IEnumerator<Bar> GetEnumerator() { return null; } // IEnumerator GetEnumerator() { return null; } // IMPOSSIBLE IEnumerator IEnumerable.GetEnumerator() { return null; } }

Foo foo = ...; // 
foo.GetEnumerator();   // calls normal typed GetEnumerator<>
((IEnumerable)foo).GetEnumerator();   // calls untyped GetEnumerator

注意类Foo如何定义返回泛型迭代器的GetEnumerator。通常情况下,现在无法定义另一个满足经典IEnumeratble的GetEnumerator。

但是,对于最后一行,使用显式接口实现,它是可能的。请注意方法名称如何以接口名称为前缀。

另外,要小心:所有显式实现都是PRIVATE,这就是为什么它上面没有访问说明符的原因。这意味着,尽管成功定义了它们,但您无法在此过载。除非你将Foo转换为普通的IEnumerable,否则显式的将永远被隐藏并且永远不会被使用。

所以:

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
    }
}

警告:该规则也在课堂上进行。身体,有时可能会产生误导:

{{1}}