决定使“null as string”返回null的理由是什么?

时间:2012-04-09 20:59:05

标签: c#

除了向后兼容性之外,还有任何令人信服的理由:

(null as string) == null; //true

5 个答案:

答案 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/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

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 stringfalse,因此根据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转换为字符串引用时,您将获得一个空字符串引用。