这个问题是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