除了向后兼容性之外,还有任何令人信服的理由:
(null as string) == null; //true
答案 0 :(得分:18)
expr as T
表示
expr
指向T
的实例,则(T)expr
(T)null
,否则(T
必须是可以为空的类型)
无论您选择哪个分支,null as T
都会为(T)null
生成T
。
答案 1 :(得分:12)
你的问题含糊不清,基本上不负责任,所以我不打算回答。如果您真正想要的是关于as
运算符的设计注意事项的文章,请参阅:
http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-as-is.aspx
如果您对C#类型系统中转换分析角色的更一般主题感兴趣,请参阅:
http://blogs.msdn.com/b/ericlippert/archive/tags/conversions/
答案 2 :(得分:11)
有没有令人信服的理由
是的,没有一个System.String
实例将null
转换为非空实例是有意义的。可以这样想:显然null is string
应该评估为false,因为null
没有引用string
的实例。由于null is string
为false
,因此根据null as string
的定义,null as string
应为null
。
超越向后兼容性
向后兼容什么?
让我转过来问你?您认为string
应该评估为null as string
的非空实例?
答案 3 :(得分:3)
这只是因为空字符串引用等于null。如果你打破这个并显示“临时”变量,那么理解起来要简单得多:
string temporary = null as string;
bool result = temporary == null; // Obviously true still
答案 4 :(得分:3)
由于null as string
求值为null的相同原因,表达式(string)null
的计算结果为null:当您将null转换为字符串引用时,您将获得一个空字符串引用。