为什么 is 运算符在给定 null 时返回 false?

2024-02-25

在我看来,is运营商有点不一致。

bool Test()
{
    // Returns false, but should return true.
    return null is string;
}

人们期望null值属于任何引用(或可为空)类型。事实上,C# 语言规范的说法支持了这一假设,例如(6.1.6 隐式引用转换):

隐式引用转换为:
...
• 从空文字到任何引用类型。

的描述(7.10.10 is 运算符)is运算符首先表示表达式(E is T)当引用转换为 true 时,结果为 trueE to T存在,但作者继续明确排除以下情况:E is the null字面意思或有一个null value.

他们为什么这么做?对我来说这似乎违反直觉。


这个问题是2013 年 5 月 30 日我博客的主题 http://ericlippert.com/2013/05/30/what-the-meaning-of-is-is/。感谢您提出的好问题!


你正盯着一条空荡荡的车道。

有人问你“你的车道能停一辆本田思域吗?”

是的。是的,它可以。

有人给你指了第二条车道。它也是空的。他们问“我的车道上当前的内容能适合你的车道吗?”

是的,显然。两条车道都是空的!很明显,一个的内容可以适合另一个,因为两者一开始就没有内容。

有人问你“你的车道上有一辆本田思域吗?”

不,不是的。

你认为is运营商回答第二个问题:给定这个值,它适合该类型的变量吗?空引用适合这种类型的变量吗?是的,它确实。

这不是问题所在is操作员回答。问题是is操作员的回答是第三个问题。y is X不问”is y类型变量的合法值X?“它问”Is y对类型对象的有效引用X?" 由于空引用不是对的有效引用any的对象any类型,答案是“否”。那条车道是空的;它不包含本田思域。

另一种看待它的方式是y is X回答问题“如果我说y as X,我会得到非空结果吗?如果 y 为空,显然答案是否定的!


更深入地研究你的问题:

人们期望空值属于任何引用(或可为空)类型

人们会隐含地假设type is a 一组值, 然后分配兼容性值 y 与类型 X 的变量无非就是检查 y 是否是集合 x 的成员.

尽管这是查看类型的一种极其常见的方式,但这并不是only看待类型的方式,这不是 C# 看待类型的方式。空引用是 C# 中没有类型的成员;分配兼容性 is not只是检查一个集合以查看它是否包含一个值。只是因为空引用是分配兼容引用类型 X 的变量并不意味着 null 是类型 X 的成员。“赋值是否兼容”关系和“是类型的成员”关系显然有很多重叠,但它们在定义上并不相同。 CLR。

如果您对类型论的思考感兴趣,请查看我最近关于该主题的文章:

你所谓的“类型”是什么?第一部分 http://blogs.msdn.com/b/ericlippert/archive/2011/08/29/what-is-this-thing-you-call-a-quot-type-quot-part-one.aspx

你所谓的“类型”是什么?第二部分 http://blogs.msdn.com/b/ericlippert/archive/2011/09/07/what-is-this-thing-you-call-a-quot-type-quot-part-two.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 is 运算符在给定 null 时返回 false? 的相关文章

随机推荐