【问题标题】:How do you specify that a generic reference type is nullable when a subclass constraint is used in c# 8?在 c# 8 中使用子类约束时,如何指定泛型引用类型可以为空?
【发布时间】:2019-11-18 02:43:15
【问题描述】:

在 c# 8 中使用子类约束时,如何指定泛型引用类型可以为空?我进行了一些搜索,但没有找到有用的结果。

我很清楚添加where T: class 来指定泛型类型参数T 是引用类型就足够了。这样,C# 8 的nullable 引用注释和警告功能就可以完美运行。

但是,在某些情况下,泛型类型参数T 是另一个类的子类型,例如SomeClass。现在,当您添加where T: SomeClass 时,您基本上是在告诉编译器T 是一个引用类型,它是SomeClass 的子类型,因为值类型不能是引用类型的子类型。但是,对于 C# 8 的nullable 引用注解和警告特性,编译器似乎并不理解这一点。如何让编译器清楚?

想看一些代码吗?这就是我的意思:

// this compiles
class ClassA<T> where T: class
{
    public GenericType<T?> DoSomething()
    {
        thrown new NotImplementedException();
    }
}
// this doesn't compile, but SomeClass is a class and it should work
class ClassA<T> where T: SomeClass
{
    // here, you get the classic:
    // Only non-nullable value type could be underlying of 'System.Nullable'
    // What this makes clear is that the compiler doesn't understand that
    // T is strictly a reference Type now
    public GenericType<T?> DoSomething()
    {
        thrown new NotImplementedException();
    }
}

【问题讨论】:

  • 我无法重新创建它。如果我启用可为空的引用类型,那么您的两个代码 sn-ps 都会编译。如果我禁用它,那么也不会。
  • 我也无法重现。
  • 尝试了构建,它奏效了。看来这是一个 VS/Resharper 智能感知问题。对不起。
  • 很高兴你能成功
  • 这是一个 C# 8 功能,可为 Nullable 引用类型。

标签: c# generics c#-8.0 nullable-reference-types


【解决方案1】:

您需要启用可空引用类型功能

一种方法是启用#nullable

#nullable enable

【讨论】:

  • 我已经在 csproj 中启用了它,为了确定,我也尝试使用 #nullable 指令添加它,但它仍然不起作用。
【解决方案2】:

我发布这个是为了让人们更容易找到它。就我而言,这实际上不是编译问题,只是 Resharper 的错误突出显示让我感到困惑。

要进行故障排除,请尝试构建。如果没有错误并且您使用 Resharper,那么 Resharper 就是罪魁祸首。您可以放心地忽略它。

我会向 Resharper 提交报告,以便他们尽快解决此问题。

【讨论】:

  • 这不是问题。 SomeClassType?Nullable&lt;SomeClassType&gt; 毫无意义。所有引用类型在设计上都可以为空。
  • 是的,所有引用类型在设计上都可以为空。但是,在代码中,有时您想区分可以为空的变量和不能为空的变量。这就是在 c# 8 中引入该功能的原因
  • 来自文档: ?未附加到类型名称的是不可为空的引用类型。当您启用此功能时,这包括现有代码中的所有引用类型变量。
  • @vasily.sib 没有class? 约束。但是,在 C# 8 中添加了 notnull 约束。
猜你喜欢
  • 2011-12-11
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多