【问题标题】:Nullable template field可为空的模板字段
【发布时间】:2020-04-29 05:33:13
【问题描述】:

我在 C# 应用程序中发现了这种代码:

public class MyClass<T> where T:class
{
    public T? field1 { get; set; }
}

我不明白为什么,但我的开发环境出现此错误:

[CS8627] 可空类型参数必须已知为值类型或不可空引用类型。考虑添加“类”、“结构”或类型约束。

有什么想法吗?

【问题讨论】:

  • 为什么要使用约束where T : class?由于此约束而发生错误。只有结构类型可以为空。引用类型(由约束where T : class 指定)不能为空(在C#8 之前)。
  • 这个答案可能对stackoverflow.com/a/58852480/10983940有帮助
  • 如果我删除“where T : class”也会出现同样的问题

标签: c#


【解决方案1】:

可空 (?) 运算符用于将 null 分配给值类型对象。通常您不能将null 分配给valuetyped 数据类型,例如intlongDateTime 等。

MyClass<T> where T:class

但在您的情况下,您明确表示您的泛型类型 (T) 只能是 class。类始终是引用类型的,并且可以本地分配给 null。这就是它显示错误的原因,您不需要将其标记为可空

这将编译,因为 T 始终是 struct 并且结构是值类型的

public class MyClass<T> where T : struct
{
    public T? field1 { get; set; }
}

这不会编译,因为编译器不知道T 是否也可以是class

public class MyClass<T>
{
    public T? field1 { get; set; }
}

【讨论】:

    【解决方案2】:

    只有您从 T 中删除询问点,您的代码才能正常工作?财产。 一个类默认可以为空

    【讨论】:

      猜你喜欢
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多