2015-08-04 3 views
6

у меня есть две общих, перегруженные методы вида:Общий метода перегружать неоднозначный с обнуляемыми типами

public string Do<T>(T maybeValue, Func<T, string> func) 
    where T : class 
{ 
    if(maybeValue == null) return null; 
    return func(maybeValue); 
} 

public string Do<T>(T? maybeValue, Func<T, string> func) 
    where T : struct 
{ 
    if(!maybeValue.HasValue) return null; 
    return func(maybeValue.Value); 
} 

Теперь, вызвав метод с переменным типом Nullable, C# отказывается компилировать и говорит, что призыв неоднозначен между двумя перегрузками:

int? maybeX = 3; 
Do(maybeX, x => x.ToString()); 

вызов неоднозначен между следующими методами или свойствами: «Program.Do<int?>(int?, System.Func<int?,string>)» и ' Program.Do<int>(int?, System.Func<int,string>) "

Easy исправления должны включать общий параметр при вызове метода, или указать тип лямбда-аргумента:

Do<int>(maybeX, x => x.ToString()); 
Do(maybeX, (int x) => x.ToString()); 

Interestingely, выбирая int? в качестве универсального типа при вызове не компилируется

Тип должен быть ссылочным типом, чтобы использовать его в качестве параметра «Т» в общем типе или методе ».

Почему? Очевидно, что только одна из двух перегрузок может использоваться со значением типа int?, но компилятор говорит, что вызов неоднозначен. Могу ли я еще больше ограничить методы, чтобы помочь компилятору решить, какой метод вызывать, не имея вызывающего кода, указать тип явно?

ответ

3

Ограничение where T : class не является частью подписи метода. Эта проверка происходит позже в процессе выбора метода перегрузки.
Вот почему это считается неоднозначным. Оба метода являются совпадением перед проверкой любых ограничений.
Если вы прямо скажете Do<int?>, то только первый метод является совпадением, но тогда ограничение «пинает» и определяет, что оно неверно, потому что int? не является ссылочным типом.

Второй метод будет выбран, если вы измените его на:

public static string Do<T>(T? maybeValue, Func<T?, string> func) 
    where T : struct 
Смежные вопросы