C# 方法重载解析

3

我有这些方法:

    static void OverloadedMethod(Action<ulong> handlerAction)
    {            
    }

    static void OverloadedMethod(Action<float> handlerAction)
    {
    }

    static void HandlerA(ulong dataProgress)
    {
    }

    static void HandlerB(float dataProgress)
    {
    }

我可以调用

OverloadedMethod(HandlerA);

没有问题,但如果我尝试调用

OverloadedMethod(HandlerB);

编译器报错:调用不明确。
我已阅读这篇文章,但我不理解为什么编译器知道如果参数是ulong应该选择哪个方法,但在参数为float的情况下无法解决同样的情况...
2个回答

1
根据MSDN,ulong到float之间有一个预定义的隐式转换。因此,这个隐式转换会阻止编译器识别要调用哪个方法。

2
但是,如果我们有像 static void SomeMethod(float a){Console.WriteLine("In float method");}static void SomeMethod(ulong a) { Console.WriteLine("In ulong method");} 这样的方法,并且像 SomeMethod(10); 这样调用它,那么它会正确解析,编译器不会出现任何歧义错误。因此,我不确定是否是隐式转换阻止了重载解析。 - Habib
这是标准类型转换,我们在讨论通用类型,对于泛型没有隐式转换。 - Guillermo Ruffino
@BartoszKP,在阅读了您的回答之后:所以,由于float可以是float或从ulong隐式转换而来的float_隐式转换发生,它们都没有更好的。但是,由float隐式获得ulong是不可能的,这是毫无疑问的,对吧? - Nomada

-2

看一下协变和逆变这里


1
仅提供链接的答案通常不可接受。在您的回答中包含链接,但您需要直接在此处总结相关部分。 - tnw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接