与 Nullable reference types激活,如何授权一个Func
参数为空?
public void Test<TIn, TOut>(Func<TIn, TOut> func)
{
var r = func(default); // default may be null, I got an error.
}
目前我用以下方法解决这个问题:
public void Test<TIn, TOut>(Func<TIn, TOut> func)
{
var r = func(default!); // null it is !
}
但我只是想标记 func
在输入中接受空值:
public void Test<TIn, TOut>(Func<TIn?, TOut> func) // do not work
{
var r = func(default);
}
我还尝试构建自己的委托(delegate):
public delegate TOut Dunc<in TIn, out TOut>(TIn? in);
但随后出现错误:请将 TIn 标记为类或结构。
最佳答案
编辑
下面的代码(来自 here)现在在 C# 9 中是合法的
public T? GetDefault<T>()
{
return default;
}
原始答案
T?
可能有不同的含义
- 如果
T
是一个结构,它是Nullable<T>
的别名 - 如果
T
是一个类它是一个加糖的NullableAttribute
告诉编译器我们在这里允许空引用。
标记一个泛型方法或委托(delegate)某些参数或返回值可能是空引用。我们可以强制泛型类型成为引用并使用 ?
T? Result<T>() where T : class;
或者我们可以使用 notnull为这种情况建立的约束:
T? Result<T>() where T : notnull;
关于c# - 如何标记通用委托(delegate)以接受空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58863932/