Следующая пара функций пытается реплицировать нулевой условный оператор, доступный в С# 6.0:
public static TResult Bind<T, TResult>(this T obj, Func<T, TResult> func)
where T : class
{
return obj == null ? default(TResult) : func(obj);
}
public static TResult Bind<T, TResult>(this Nullable<T> obj, Func<T, TResult> func)
where T : struct
{
return obj.HasValue ? func(obj.Value) : default(TResult);
}
Первая функция ограничена классами, а для String s
позволяет написать что-то вроде:
var x = s.Bind(a => a.Substring(1));
Вторая функция - это проблема, с которой я сталкиваюсь. Например, для a int? number
я хотел бы написать:
var y = number.Bind(a => a + 1);
Однако это дает мне следующую ошибку:
Вызов неоднозначен между следующими методами или свойствами: 'BindingExtensions.Bind < T, TResult > (T, Func < T, TResult > )' и 'BindingExtensions.Bind < T, TResult > (T?, Func < T, TResult > ) '
Я предполагаю, что это имеет какое-то отношение к взаимодействию между типом вывода анонимной функции и разрешением перегрузки метода. Если я укажу тип a как int
, чем он компилируется просто отлично.
var y = number.Bind((int a) => a + 1);
Однако это явно меньше желаемого. Может ли кто-нибудь сказать мне, почему компилятор считает, что вышеупомянутый вызов привязки неоднозначен и/или предлагает способ исправить это? Я знаю, что могу просто назвать две функции по-разному, но что это за забава?