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)
Eri*_*ert 11
这里的问题基本上是"为什么编译器没有考虑到它知道赋值是一个已知为null的常量引用这一事实?"
答案是:为什么要这样?将这些信息考虑在内有什么令人信服的好处?您故意说"我希望将此表达式视为类型对象",并且您不能将类型对象的值赋给string类型的变量.在这种情况下允许这样做有什么好处?
在我看来,代码很可能是一个错误; 当然编译器应该告诉你它而不是允许它.
不是null只是一堆零指向"无处"的内存地址,无论类型是什么?
这就是C或C++等弱类型语言.
在C#中,引用的类型是其标识的组成部分. (string)null是不是(object)null因为一个是一个string而一个是一个object.
此外,在C#中null并没有真正的数字等价物.C#中的引用与指针不同,从语义上讲,它们没有相关的内存地址. null简单地表示引用不指向对象,null引用的内部表示是实现细节.
| 归档时间: |
|
| 查看次数: |
1247 次 |
| 最近记录: |