【问题标题】:What does class? (class with question mark) mean in a C# generic type constraint?上课做什么? (带问号的类)在 C# 泛型类型约束中是什么意思?
【发布时间】:2020-01-07 14:35:01
【问题描述】:

当我试图找到另一个问题的答案时,我注意到这段代码是用 C# 编译的:

public void Foo<T>(T obj)
    where T : class?
{
}

我没有设法在文档中找到它的含义。

附:显然有人已经决定关闭一个问题,甚至没有弄清楚“重复”并没有真正的联系。首先尝试解决问题而不是结束问题有那么难吗?副本是关于可以为空的原始类型,而可以为空的引用类型是完全不同的。除了看到他们都有问号并将问题标记为重复的人。

【问题讨论】:

  • “我认为这意味着 T 是一个可以为空的引用类型,但显然它不是” - 为什么这很明显?
  • 因为我在尝试分配可为空的引用类型时收到警告
  • 这正是它打算做的,不是吗?否则你会发生什么?
  • 我收到此警告:“当 'T' 是不可为空的引用类型时,空文字会引入空值。”当你说类?意味着它是从 nullable 派生的?
  • @IlyaChernomordik:我要求版主干预以重新提出您的问题。

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


【解决方案1】:

它强制 T 必须是可为空的引用类型。

您为 T 设置的类型,必须派生自 object?

这是 C#8 中的一项新功能,可显式声明一个类型为可为空的。 如果你有

 Add<T>(T tmp);

你的文档,加null就可以了;

【讨论】:

  • 检查我更新的问题,我已经编辑它以显示编译器似乎并不完全了解这一点。然而,似乎当我调用 Foo 时,如果可空性与您所说的不匹配,它确实会发出警告
  • 我想我需要一个单独的问题
  • 如果您只有 T : 类,并且您尝试返回“null”,那么这将是一个错误。它确保(记录)类型为 的变量而没有 ?确实持有一些东西,而不是空值。有一个编译器开关可以规定如果这会产生警告或错误,因为它是一个破坏性的变化,如果它立即被声明为错误,那么所有旧的寒冷将不再起作用。因此请注意:如果您查看较旧的代码版本,则适用其他规则。
  • 我的问题是为什么它会给出一个警告 T: class?即使我们说它可以为空
  • Any nullable reference type (noted by ? after the type in the variable declaration) may be null. Static analysis determines if the value is known to be non-null when it is dereferenced. If not, the compiler warns you. 从这里docs.microsoft.com/en-us/dotnet/csharp/nullable-references。您应该如何处理警告 - 我不确定。
【解决方案2】:

要让你的类在没有CS864 警告的情况下返回null 值,你可以稍微重写你的代码

public T? Foo<T>(T obj)
    where T : class
{
    return null;
}

关于class? 的问题现在是开放的GitHub issueclass? 约束尚未实现,因此编译器会像常规 class 一样威胁它,并暂时生成 A null literal introduces a null value when 'T' is a non-nullable reference type

您也可以参考article 中的T 的问题? 部分以查看一些详细信息。上面的代码示例是处理可空泛型类型的推荐方法

【讨论】:

  • 是的,我已经在另一个问题中弄清楚了。但是我不明白为什么要说类?编译器不够用
  • 对,所以这是一个错误,我真的很想知道为什么它会以这种奇怪的方式工作:)
  • 目前这还不够,还有一个待解决的未解决问题,您可以在附加的 GitHub 链接中看到
  • @IlyaChernomordik 我想说,它还没有实现。因为specification 说有可能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
相关资源
最近更新 更多