c# - 如何标记通用委托(delegate)以接受空值?

标签 c# nullable

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/

相关文章:

c# - 使用 FileHelpers 库映射包含空格的列

sql - 如何将 SqlBulkCopy 与可为空的列一起使用

c# - 如何在java中编写可为空的int?

java - 空分析注释包之间有什么区别?

c# - 解释这段代码

javascript - MVC Bundle 不适用于 Release Configuration(Debug 为 False),CSS 和 JS 未加载

VB.NET 2015 可空整数不使用 If() 运算符?

c# - 可空 <T> : and overloaded operators, bool 值? & bool

c# - 如何使用一次性设置?

c# - AutoMapper 5.2如何配置