【问题标题】:Why T? is not a nullable type?为什么是T?不是可以为空的类型吗?
【发布时间】:2021-09-27 21:35:51
【问题描述】:

为什么下面的代码不起作用?

public T? Method<T>() 
{
    /*
     error CS0403: Cannot convert null to type parameter 'T' 
     because it could be a non-nullable value type.
     Consider using 'default(T)' instead.
    */
    return null;
}

【问题讨论】:

标签: c#


【解决方案1】:

为了向后兼容,T? 被实现为纯编译时构造。对于引用类型,它在运行时与T 相同。对于值类型,它被转换为Nullable&lt;T&gt;。编译器需要在编译时确定 T 是一个值类型来进行翻译。因此对于无约束类型T,编译器不能假定T? 可以为空。

要获得 OP 中的行为,唯一的 OOTB 方法似乎是重载引用和值类型的方法。不幸的是,更改类型约束不足以解决重载问题,因此名称或参数也需要不同。

public static T? Method<T>() where T : struct
{
    return null;
}

public static T Method<T>(int placeholder = 0) where T : class
{
    return null;
}

根据您要执行的操作,Chenga 的解决方案可能更易于使用,但如果您绝对需要它返回具有不可为空类型约束的 null,这将起作用。如果您担心default 是一个非空值,您还可以实现一个Optional type,例如链接问题中的那个并返回它而不是T

【讨论】:

    【解决方案2】:

    你有两个选择:

    1. return default(T) - 我的来源是: https://www.c-sharpcorner.com/article/defaultt-in-generics/

    2. 添加约束:where T : class

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 2010-10-21
      • 2016-02-13
      • 1970-01-01
      • 2015-10-22
      相关资源
      最近更新 更多