代码有几个问题.第一个是你的类型必须是可空的.您可以通过指定来表达where T: struct
.您还需要指定,where TResult: struct
因为您也将其用作可空类型.
一旦你修好了,where T: struct where TResult: struct
你还需要改变返回值类型(这是错误的)和其他一些东西.
在解决了所有这些错误并简化之后,你最终得到了这样的结论:
static TResult? ApplyFunction(T? nullable, Func function) where T: struct where TResult: struct { if (nullable.HasValue) return function(nullable.Value); else return null; }
请注意,您可以重写Nullable
为T?
这使得事情更易读.
你也可以把它写成一个语句,?:
但我不认为它是可读的:
return nullable.HasValue ? (TResult?) function(nullable.Value) : null;
您可能希望将其放入扩展方法中:
public static class NullableExt { public static TResult? ApplyFunction(this T? nullable, Func 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);
正如错误所示,编译器无法保证T不会是可空的.您需要向T添加约束:
static NullableApplyFunction (Nullable nullable, Func function) : where T : struct where TResult : struct