у меня есть две общих, перегруженные методы вида:Общий метода перегружать неоднозначный с обнуляемыми типами
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?
, но компилятор говорит, что вызов неоднозначен. Могу ли я еще больше ограничить методы, чтобы помочь компилятору решить, какой метод вызывать, не имея вызывающего кода, указать тип явно?