Wystąpił szereg problemów z kodem. Pierwszym z nich jest to, że twoje typy muszą być neutralne. Możesz wyrazić to, podając where T: struct
. Będziesz także musiał podać where TResult: struct
, ponieważ używasz tego również jako typu zerowego.
Po naprawieniu where T: struct where TResult: struct
należy również zmienić typ wartości zwracanej (która była nieprawidłowa) oraz kilka innych rzeczy.
Po zamocowaniu te wszystkie błędy i uproszczenia, można skończyć z tym:
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;
}
pamiętać, że można przepisać Nullable<T>
jak T?
która sprawia, że rzeczy stają się bardziej czytelne.
Również można napisać, że w jednym sprawozdaniu wykorzystaniem ?:
ale nie sądzę, że to tak czytelne:
return nullable.HasValue ? (TResult?) function(nullable.Value) : null;
Może chcesz umieścić to w metodę rozszerzenia:
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;
}
}
Następnie można napisać kod w następujący sposób:
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);
I jakie jest pytanie? –
Nie można go teraz przetestować, ale wywołuje się 'ApplyFunction' zamiast 'ApplyFunction '? –
Dlaczego spadki? Wydaje mi się, że to dobre pytanie. –