`Nullable<T>`是什么?

7
我犯了一个错,但Visual Studio没有将其标记为错误: void Method(Nullable<SpriteFont>? font = null) { } 输出中的font显示为SpriteFont??。我刚才做了什么?
更新:抱歉,大家,我没有尝试编译它,直到我这样做之前它才没有显示为错误。不过,奇怪的是,它在输出中看起来像Type??
此外,SpriteFont已经是可空的,所以我无论如何都会得到一个错误 :(

9
你将字体定义为 Nullable<Nullable<SpriteFont>>。 - manman
1
我曾认为接受空值的类型不能被赋予可空性……就像类一样。 - Miguel Angelo
@manman:把那个作为答案。 - zerkms
@Miguel Angelo:泛型约束中是否有“not”谓词?如果没有,如何限制它? - zerkms
1
Nullable<T> 结构体是一种特殊类型... 它在 C# 编译器和 CLR 中的处理方式都不同。 - Miguel Angelo
2个回答

4

我刚才在这里尝试了一下,但是无法复现你所说的情况。

以下所有语句均无法编译:

  • Nullable<int>? a = 1;
  • Nullable<Nullable<int>> b = 1;
  • Nullable<int?> a = 1;
  • void A(Nullable<Nullable<int>> a)
  • void A(Nullable<int>? a)
  • void A(Nullable<int?> a)

使用 Visual Studio 2012,C# 4 或 5(我想),.Net Framework 4.5。


2
@Vulcan:不,我认为这是一个答案,因为问题本身似乎有误。 - user541686
2
@Vulcan:对于错误的问题或虚假的陈述,不存在答案...只有反例。 - Miguel Angelo
3
这实际上是一个答案。当答案基本上说“我不知道你是怎么得到你得到的东西的时候”,通常问题就是问题本身 :) - Tim Post

4

编辑器的语法检查未能用红色波浪线标记它为错误。而不是编译器。

这是两个不同的代码块。当您输入代码时,语法检查始终处于打破状态,需要采用非常不同的方法。


这是唯一的解释!这也意味着问题是在没有实际编译代码的情况下提出的。 - Miguel Angelo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接