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

C# 决定让“null as string”返回null的理由是什么?,c#,C#,除了向后兼容之外,是否还有其他令人信服的原因: (null as string) == null; //true 这只是因为null字符串引用等于null。如果您将其分解并显示临时变量,则更容易理解: string temporary = null as string; bool result = temporary == null; // Obviously true still 这只是因为null字符串引用等于null。如果您将其分解并显示临时变量,则更容易理解: string t

除了向后兼容之外,是否还有其他令人信服的原因:

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

这只是因为null字符串引用等于null。如果您将其分解并显示临时变量,则更容易理解:

 string temporary = null as string;
 bool result = temporary == null; // Obviously true still

这只是因为null字符串引用等于null。如果您将其分解并显示临时变量,则更容易理解:

 string temporary = null as string;
 bool result = temporary == null; // Obviously true still
expr作为T的意思

如果expr指向T的一个实例,那么Texpr 特努尔,不然 并且T必须是可为null的类型

无论您采用哪个分支,null作为T都会产生Tnull,对于任何T.

expr作为T的意思

如果expr指向T的一个实例,那么Texpr 特努尔,不然 并且T必须是可为null的类型

无论您采用哪个分支,null作为T,对于任何T都会产生Tnull

有什么令人信服的理由吗

是的,System.String的实例中没有一个将null转换为的非null实例是有意义的。可以这样想:显然null是string,它的值应该为false,因为null不引用string的实例。由于null is string为false,根据null as string的定义,null as string应该为null

超越向后兼容性

向后兼容什么

让我把问题转到你身上?您认为null作为字符串应该计算为哪个字符串的非null实例

有什么令人信服的理由吗

是的,System.String的实例中没有一个将null转换为的非null实例是有意义的。可以这样想:显然null是string,它的值应该为false,因为null不引用string的实例。由于null is string为false,根据null as string的定义,null as string应该为null

超越向后兼容性

向后兼容什么


让我把问题转到你身上?您认为null as string应该计算为哪个字符串的非null实例?

表达式null as string计算为null的原因与stringnull计算为null的原因相同:当您将null转换为字符串引用时,您将获得一个空字符串引用。

表达式null as string计算为null的原因与stringnull计算为null的原因相同:当您将null转换为字符串引用时,您将获得一个空字符串引用。

您的问题很模糊,基本上无法回答,因此我不打算尝试回答它。如果您真正想要的是一篇关于as运营商设计考虑因素的文章,请参阅:

如果您对C类型系统中转换分析的作用这一更一般的主题感兴趣,请参阅:


你的问题含糊不清,根本无法回答,所以我不打算回答。如果您真正想要的是一篇关于as运营商设计考虑因素的文章,请参阅:

如果您对C类型系统中转换分析的作用这一更一般的主题感兴趣,请参阅:



我可以问你相反的问题:为什么null作为string==null不是真的?这个值应该是什么?你在这里说的是什么“向后兼容性”?就从你的问题来看,我猜String.IsNullOrEmptystring可能会对你有所帮助。为什么会是其他值?我可以问你相反的问题:为什么null as String==null不是真的?这个值应该是什么?你在这里说的是什么“向后兼容性”?从你的问题来看,我猜String.IsNullOrEmptystring可能会对你有所帮助。@blueberryfields:因为Java代码中充斥着expr instanceof T?Texpr:Tnull,C团队显然认为有一名操作员专门负责该操作是件好事。优化实践中经常出现的代码是很好的。@blueberryfields:大多数语言都只是简写。弗雷奇?速记?速记操作人员构造函数转发。Lambda表达式。使用块。仿制药。速记是高级语言和低级语言之间的区别,也是图灵完整的。@blueberryfields:Ben是正确的。整个语言都是速记!运算符是方法的简写。方法是委托类型字段的缩写。类是具有虚拟函数表的结构的缩写。throw是非局部延续的缩写。语言设计的艺术在于选择正确的速记来嵌入语言。@BenVoigt,我认为你对可空值类型的解释有点错误。例如,5作为int?表示int?5,即使5不是int?@svick的实例:好的,是的,这是T作为引用类型的规则。对于T?,它测试T的一个实例,而不是T?@blueberryfields:因为Java代码中充斥着T的expr实例?Texpr:Tnull,C团队显然认为有一个专门的操作员会很好
对那次行动负责。优化实践中经常出现的代码是很好的。@blueberryfields:大多数语言都只是简写。弗雷奇?速记?速记操作人员构造函数转发。Lambda表达式。使用块。仿制药。速记是高级语言和低级语言之间的区别,也是图灵完整的。@blueberryfields:Ben是正确的。整个语言都是速记!运算符是方法的简写。方法是委托类型字段的缩写。类是具有虚拟函数表的结构的缩写。throw是非局部延续的缩写。语言设计的艺术在于选择正确的速记来嵌入语言。@BenVoigt,我认为你对可空值类型的解释有点错误。例如,5作为int?表示int?5,即使5不是int?@svick的实例:好的,是的,这是T作为引用类型的规则。对于T?,它测试的是T的一个实例,而不是T?。