Nullable <int?>是不可能的,为什么不呢?</int?>

时间:2014-07-07 13:59:55

标签: c# .net compiler-construction nullable internals

对不起,如果它是一个愚蠢的问题,我试图更好地理解.Net中的Nullable类型。

从我注意到的Microsoft源代码(使用ReSharper),我知道Nullable是一个结构,T需要是一个结构

public struct Nullable<T> where T : struct

现在,我试图做这样的事情

public struct CustomNullable<T> where T : struct
{
}
public class CustomNullableClass<T> where T : struct
{
}

编译时出错:

  Nullable<int?> a = null;
  Nullable<Nullable<int>> a1 = null;

对于上面提到的代码,我得到一个错误'只有非可空的值类型可能是System.Nullable的基础',但是如何在Nullable类型中强制执行?

   CustomNullable<int?> a2 = null;
   CustomNullableClass<int?> a3 = null;

我收到错误'类型System.Nullable必须是不可为空的值类型才能将其用作参数T'。

我现在有点困惑,有人可以帮助我理解发生了什么或者我不明白的东西?

提前多多感谢。

编辑: 如果结构是值类型而值类型不能为null,那么Nullable如何成为结构?

Credit:spender

2 个答案:

答案 0 :(得分:9)

实际上,它是C#编译器(猜测)中的某个内部黑客。您无法在自己的类中复制它。如果你使用完全相同的IL制作自己的类型,它将强制执行额外的隐藏约束。

答案 1 :(得分:4)

专门针对Nullable的编译器支持。您无法使用自定义结构复制Nullable的许多不同行为。其中一种行为就是您在此处提到的行为,Nullable不符合struct的通用约束,尽管struct为<{1}}。