可能重复:
C#可以将值类型与null进行比较
如果我尝试null在C#中分配一个不可为空的类型:
System.DateTime time = null;
Run Code Online (Sandbox Code Playgroud)
我会得到一个编译时错误:
错误CS0037:无法将null转换为'System.DateTime',因为它是一个不可为空的值类型
这是有道理的.但如果比较相同的类型null:
System.DateTime time = obtainFromSomewhere();
if( time == null ) {
//whatever;
}
Run Code Online (Sandbox Code Playgroud)
没有编译时错误.这对我来说没有意义 - 如果我不能分配null那么为什么会这样null呢?
为什么我可以将非可空类型与null?进行比较?
我知道在编程语言中不需要NULL,我最近决定不在我的编程语言中包含NULL.声明是通过初始化完成的,因此不可能有一个未初始化的变量.我希望这将消除NullPointerException支持更有意义的例外或者根本没有某些类型的错误.
当然,由于语言是用C实现的,因此在封面下会使用NULL.
我的问题是,除了使用NULL作为错误标志(这是用异常处理)或作为数据结构的端点,如链接列表和二叉树(这是由有区别的联合处理)是否有任何其他用例为NULL哪个我应该有解决方案?没有NULL可能会给我带来什么问题吗?
我一直听到人们谈论非可空引用类型将如何解决如此多的错误并使编程变得更加容易.即使是null的创建者也称它为十亿美元的错误,而Spec#引入了非可空类型来解决这个问题.
编辑:忽略我对Spec#的评论.我误解了它是如何工作的.
编辑2:我必须和错误的人交谈,我真的希望有人能够与之争辩:-)
所以我猜想,在少数人中,我错了,但我不明白为什么这场辩论有任何优点.我认为null是一个bug查找工具.考虑以下:
class Class { ... }
void main() {
Class c = nullptr;
// ... ... ... code ...
for(int i = 0; i < c.count; ++i) { ... }
}
Run Code Online (Sandbox Code Playgroud)
BAM!访问冲突.有人忘了初始化c.
现在考虑一下:
class Class { ... }
void main() {
Class c = new Class(); // set to new Class() by default
// ... ... ... code ...
for(int i = 0; i < c.count; ++i) { ... …Run Code Online (Sandbox Code Playgroud)