为什么没有Nullable的实例<>类型?

时间:2017-07-10 11:50:36

标签: c# .net types

在编写涉及手动类型检查的测试时,我发现null未评估为Nullable<>类型的实例,例如对于类型Nullable<int>(与int?相同),以下语句为false

null is int?
null分配给int?时,

有效。为什么会这样?

3 个答案:

答案 0 :(得分:2)

那么,为什么nullables会特别?这不代表任何引用类型,句点:

var isObject = null is object;

会给你一个编译时错误:

  

错误CS0184:给定的表达式永远不是提供的('对象')类型

Nullable<T>在这里是一个红鲱鱼。

null的类型是 null类型,它可以分配给任何引用类型或可空类型,因为存在隐式转换(第2.4.4.6节)。

根据规范,此is运算符的工作方式如下(第7.10.10节):

  

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

     
      
  1. 如果E是匿名函数,则发生编译时错误
  2.   
  3. 如果E 方法组或空文字,或者E的类型是引用类型或可空类型且E的值为null, 结果是错误的。(...)
  4.   

粗体部分澄清。

阅读thisthis answer了解详情。

答案 1 :(得分:0)

可能令人困惑的是<script> $("input[type='reset']").click(function(){ $("input").val(""); $("input[type='radio']").prop('checked', false); }); </script> 可以是值和类型。

如果您比较或分配null,则会使用以下隐式转换首先将值转换为null

Nullable

如果您使用public static implicit operator Nullable<T> ( T value ) 而不是值,则会进行类型比较。由于is类型为null而非null,因此它们不相等。

答案 2 :(得分:0)

在sort 中: - 通过使任何值类型为nullable,null不会转换为该类型,或者null不属于该类型。如果变量被赋值为null,则为null,HasValue属性sturct变为false,然后boxing将返回null的引用,但这并不意味着它是特定值类型。

您需要了解

的实施和工作
Nullable<T>

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

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

我刚刚从Microsoft docs复制了这一行,它会让你对洞概念有所了解 阅读整个文档的链接如下:

https://docs.microsoft.com/en-us/dotnet/api/system.nullable-1?view=netframework-4.7