2014-11-10 10 views
3

У меня есть эти методы:C# Метод перегрузки разрешения

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); 

Компилятора жалуется: Неоднозначная Инвокация ,

Я прочитал this article, но я не понимаю, почему компилятор знает, какой метод следует выбрать, если параметр является ULONG, но он не может решить ту же самую ситуацию, если параметр является поплавок ...

ответ

1

Согласно MSDN , существует предопределенное неявное преобразование из ulong в float. В результате неявное преобразование не позволяет компилятору определить, какой метод вызывать.

+2

Но если у нас есть такие методы, как 'статической ничтожной SomeMethod (плывите) {Console.WriteLine («В методе плавающей»);}' и 'статической ничтожной SomeMethod (ULONG a) {Console.WriteLine («В методе ulong»);} 'и называть его как' SomeMethod (10); 'затем он корректно решает и не возникает двусмысленной ошибки компилятора. Поэтому не совсем уверен, что это неявное преобразование, предотвращающее перегрузку. – Habib

+0

Это стандартное преобразование типов, здесь мы говорим об общих типах, нет никакого неявного литья для дженериков. –

+0

@BartoszKP, после прочтения вашего ответа: так что, поскольку float может быть float или float, неявно преобразованный из ulong _implicit conversion, и ни один из них не лучше_. Но поскольку улунг не может быть неявно получен из плавающего, нет сомнений, верно? – Nomada

-2

Взгляни на ковариации и контрвариациях here

+1

Ответы только на связь, как правило, неприемлемы. Включите ссылку в свой ответ, но вам нужно суммировать соответствующие биты непосредственно в своем сообщении здесь. – tnw

Смежные вопросы