C# C中按返回类型重载函数#

C# C中按返回类型重载函数#,c#,methods,overloading,explicit,C#,Methods,Overloading,Explicit,我目前正在学习C#,有人告诉我,可以使用explicit关键字重载方法返回类型,但他从未解释过如何重载。我搜索了所有地方,也阅读了一些关于stackoverflow的问题和答案,但我没有发现这样的事情,而且,在大多数情况下,回答的人说不可能通过返回类型重载方法。在这一切之后,我开始认为没有这种可能性。现在有人真的知道如何通过使用explicit关键字来重载方法返回类型了吗?或者这是可能的吗? 先谢谢你 我不认为返回类型会过载。返回类型不包括在方法签名中。编译器在检查返回值是否会在更大的上下文中导

我目前正在学习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??
} 

您不能按返回类型加载。但是,您可以定义仅因返回类型不同而不同的多个方法。这是两件不同的事情,常常是错误的

explicit
关键字仅与运算符相关。我想这不是他的意思,你们中的一个人可能也误用了这个词

他可能指的是显式接口实现

这是唯一允许定义许多只因返回类型不同而不同的普通方法的方法(可能除了转换运算符,但它们有些特殊)。最常见的是
GetEnumerator
,这是
IEnumerable
IEnumerable
所需要的:

公共类Foo:IEnumerable,IEnumerable
{
公共IEnumerator GetEnumerator(){return null;}
//IEnumerator GetEnumerator(){return null;}//不可能
IEnumerator IEnumerable.GetEnumerator(){return null;}
}
注意类Foo如何定义返回泛型迭代器的GetEnumerator。通常,现在不可能定义另一个满足经典IEnumerable的GetEnumerator

然而,在最后一行中,通过显式接口实现,这是可能的。注意方法名的前缀是如何加上接口名的

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

因此:

Foo-Foo=…;//
foo.GetEnumerator();//调用普通类型的GetEnumerator
((IEnumerable)foo.GetEnumerator();//调用非类型化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
    }
}
公共类Foo:IEnumerable,IEnumerable
{
公共IEnumerator GetEnumerator(){return null;}
专用无效测试()
{
//相对明显的是:
this.GetEnumerator();//调用GetEnumerator()!
((IEnumerable)this).GetEnumerator();//调用普通GetEnumerator()
}
IEnumerator IEnumerable.GetEnumerator()
{
//非常不可思议:
返回此。GetEnumerator();//调用GetEnumerator!无递归!!
//((IEnumerable)this).GetEnumerator();//将递归调用自身
}
}

我想他说的不是重载方法,而是重载运算符:这就是你要找的吗?他可能还意味着显式接口实现,它允许多个只按返回类型不同的方法。然而,严格意义上讲,这并不是过载。这是误用的常用词中的“过载”。非常感谢,这非常有帮助。我会投赞成票,但我不能。我稍后会问这个人,他是否真的重载了运算符而不是方法,可能是他使用了错误的单词,或者是故意让我头疼。但是,你可以定义多个只因返回类型不同的方法——真的吗?代码没有编译:
静态字符串F(intx){return”“;}静态intf(inty){return 0;}
@LeiYang:你错过了我的很多帖子。您在注释中提供的代码试图创建因返回类型不同而不同的重载。您看到我提供的代码示例了吗<代码>公共类Foo等等?仔细看看那个班里有什么。甚至还有一条注释标记了您不能执行的重载,并且定义了两个GetEnumerator方法,这些方法具有相同的名称、相同的参数和不同的返回类型,并且这两个方法不是重载。嗨,我不是有意要影响您,但我希望句子本身在没有其他上下文的情况下总是正确的,因为你的分数太多了。@LeiYang:
希望句子本身在没有其他上下文的情况下总是正确的
-好的,如果不阅读答案的全文,我知道这可能会产生误导。我会考虑一下,尽量改进那里的措辞。(虽然人类的交流主要是关于背景:)但我明白你的观点:)
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
    }
}