转换null不会编译

gdo*_*ica 8 .net c# compiler-construction null

我不小心在工作中写了以下代码:

string x = (object) null; 
// It was var x = (object)null and I changed from var to string instead of 
// object x = null;
Run Code Online (Sandbox Code Playgroud)

这给了我一个与此类似的编译错误: Can't cast source type object to target type string

为什么?不null只是一堆零指向"无处"的内存地址,无论类型是什么?

Jar*_*Par 23

问题不在于铸造null,而是object不能分配string.这很好用

string x = (string)null;
Run Code Online (Sandbox Code Playgroud)

如果你删除了cast(string x = null),它的工作原理在C#语言规范的2.4.4.6节中列出

null-literal可以隐式转换为引用类型或可空类型

在引入cast((object)null)的那一刻,你不再拥有null文字.相反,你有一个类型的值object.它基本上没有什么不同

object temp = null;
string x = temp;
Run Code Online (Sandbox Code Playgroud)

  • @gdoron*null对象和null字符串有什么区别?*它们的类型,这在世界上有所不同.类似于询问`(float)3`和`(int)3`是如何不同的. (6认同)

Eri*_*ert 11

这里的问题基本上是"为什么编译器没有考虑到它知道赋值是一个已知为null的常量引用这一事实?"

答案是:为什么要这样?将这些信息考虑在内有什么令人信服的好处?您故意说"我希望将此表达式视为类型对象",并且您不能将类型对象的值赋给string类型的变量.在这种情况下允许这样做有什么好处?

在我看来,代码很可能是一个错误; 当然编译器应该告诉你它而不是允许它.

  • @gdoron:现在我们已经解决了这个问题:是否一个空对象和一个空字符串引用*相同的东西*?不,当然不.**他们没有提到任何东西.**以这种方式思考.我有一张纸上贴着"最喜欢的冰淇淋".这是空白的.你有一张纸上贴着"最喜欢的电影".它也是空白的.这两张纸"是指同一件事"吗?当然不是.它们都没有引用*任何*,所以它们都没有*同样的东西*! (9认同)
  • @gdoron:内存地址?**你称之为"内存地址"是什么?**null*reference*是*reference*.实际上,确实,引用通常被实现为地址.但它不一定是; 例如,引用可以处理到由垃圾收集器维护的大表中.不要将引用视为地址; 将它们视为引用某事物的抽象概念. (6认同)
  • 或者,甚至更好:我的论文说"没有,因为我没有最喜欢的冰淇淋"而你的说"没有,我没有最喜欢的电影".现在这两篇论文的内容是指"同一件事"吗?试着告诉我这些纸片所指的*东西!根据定义,"没什么"不是*. (4认同)
  • 我越读你的答案和博文,我想你真的应该写一本关于生命意义的书.(或null的意思......) (4认同)

Sea*_*n U 5

不是null只是一堆零指向"无处"的内存地址,无论类型是什么?

这就是C或C++等弱类型语言.

在C#中,引用的类型是其标识的组成部分. (string)null是不是(object)null因为一个是一个string而一个是一个object.

此外,在C#中null并没有真正的数字等价物.C#中的引用与指针不同,从语义上讲,它们没有相关的内存地址. null简单地表示引用不指向对象,null引用的内部表示是实现细节.