C# 为什么不是';t null可为null的实例<&燃气轮机;类型?

C# 为什么不是';t null可为null的实例<&燃气轮机;类型?,c#,.net,types,C#,.net,Types,在编写涉及手动类型检查的测试时,我遇到了这样一个事实,null不会作为null类型的实例进行计算,例如,对于类型null(与int?相同)以下语句是错误的 null is int? 将null赋值给int?有效。为什么会这样?可能令人困惑的是,null可以是一个值和一个类型 如果比较或赋值null,则使用以下隐式转换将值首先转换为可为null的值 public static implicit operator Nullable<T> ( T value ) 公共静态隐式运

在编写涉及手动类型检查的测试时,我遇到了这样一个事实,
null
不会作为
null
类型的实例进行计算,例如,对于类型
null
(与
int?
相同)以下语句是错误的

null is int?

null
赋值给
int?
有效。为什么会这样?

可能令人困惑的是,
null
可以是一个值和一个类型

如果比较或赋值
null
,则使用以下隐式转换将值首先转换为
可为null的值

public static implicit operator Nullable<T> (
    T value
)
公共静态隐式运算符可为null(
T值
)


如果使用的是
,则将进行类型比较,而不是值。由于
null
属于
null
类型,而不属于
null
类型,因此它们不相等。

在排序中:-通过将任何值类型设为null,null将不会转换为该类型,或者null不是该类型。如果变量分配给null,则为null,sturct的HasValue属性变为false,然后装箱将返回null的引用,但这并不意味着它属于该特定值类型

您需要研究

Nullable<T>
Nullable
基本属性 可空结构的两个基本成员是HasValue和Value属性。如果可为Null的对象的HasValue属性为true,则可以使用value属性访问该对象的值。如果HasValue属性为false,则对象的值未定义,尝试访问value属性会引发InvalidOperationException

装箱和拆箱 当可空类型被装箱时,公共语言运行库会自动装箱可空对象的基础值,而不是可空对象本身。也就是说,如果HasValue属性为true,则Value属性的内容将被装箱。当可空类型的基础值解除绑定时,公共语言运行库将创建一个初始化为基础值的新的可空结构。 如果可为null类型的HasValue属性为false,则装箱操作的结果为null。因此,如果将装箱的可空类型传递给需要对象参数的方法,则该方法必须准备好处理参数为空的情况。如果将null解除绑定到可为null的类型中,公共语言运行库将创建一个新的可为null的结构,并将其HasValue属性初始化为false

我刚刚从微软文档中复制了这一行,它会让你对孔的概念有一些了解 阅读整个文档链接如下


那么,为什么nullables应该是特殊的呢?这不代表任何引用类型,句点:

将给您一个编译时错误:

错误CS0184:给定的表达式从来不是提供的('object')类型

Nullable
在这里是一条红鲱鱼

null
的类型为null类型,可分配给任何引用类型或可空类型,因为存在隐式转换(§2.4.4.6)

根据规范,该
操作员,其工作方式如下(§7.10.10):

is运算符用于动态检查对象的运行时类型是否与给定类型兼容。操作E的结果是T,其中E是表达式,T是类型,是一个布尔值,指示是否可以通过引用转换、装箱转换或取消装箱转换将E成功转换为类型T。在将类型参数替换为所有类型参数后,操作的计算如下所示:

  • 如果E是匿名函数,则会发生编译时错误
  • 如果E是方法组或空文本,或者E的类型是引用类型或可空类型且E的值为空,则结果为假。(…)
  • 黑体部分用于澄清


    阅读和了解更多信息。

    由于隐式转换,您可以将null指定给可为null的int。但它们不是相同的类型。添加@NtFreX注释:
    是检查类型,==检查相等性。这句话是真的:
    int?x;如果(x==null)
    也许您可以向我们解释您试图解决的潜在问题,我们可以帮助您解决@PBozo?int?可为空。int对于空值无效。
    var isObject = null is object;