在编写涉及手动类型检查的测试时,我发现null
未评估为Nullable<>
类型的实例,例如对于类型Nullable<int>
(与int?
相同),以下语句为false
null is int?
将null
分配给int?
时,有效。为什么会这样?
答案 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.在用类型参数替换所有类型参数之后,操作如下评估:
- 如果E是匿名函数,则发生编译时错误
- 如果E 方法组或空文字,或者E的类型是引用类型或可空类型且E的值为null, 结果是错误的。(...)
醇>
粗体部分澄清。
阅读this和this 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