Ответ 1
С кодом возникает несколько проблем. Первый заключается в том, что ваши типы должны быть обнуляемыми. Вы можете выразить это, указав where T: struct
. Вам также нужно указать where TResult: struct
, потому что вы используете это как нулевой тип тоже.
После исправления where T: struct where TResult: struct
вам также необходимо изменить тип возвращаемого значения (что было неправильно) и ряд других вещей.
После исправления всех этих ошибок и упрощения вы завершаете это:
static TResult? ApplyFunction<T, TResult>(T? nullable, Func<T, TResult> function)
where T: struct
where TResult: struct
{
if (nullable.HasValue)
return function(nullable.Value);
else
return null;
}
Обратите внимание, что вы можете переписать Nullable<T>
как T?
, что делает чтение более понятным.
Также вы можете написать это как один оператор с помощью ?:
, но я не думаю, что он читаем:
return nullable.HasValue ? (TResult?) function(nullable.Value) : null;
Возможно, вы захотите добавить это в метод расширения:
public static class NullableExt
{
public static TResult? ApplyFunction<T, TResult>(this T? nullable, Func<T, TResult> function)
where T: struct
where TResult: struct
{
if (nullable.HasValue)
return function(nullable.Value);
else
return null;
}
}
Затем вы можете написать код следующим образом:
int? x = 10;
double? x1 = x.ApplyFunction(i => Math.Sqrt(i));
Console.WriteLine(x1);
int? y = null;
double? y1 = y.ApplyFunction(i => Math.Sqrt(i));
Console.WriteLine(y1);