C#-为什么不';t对象类具有true运算符
本文关键字:true 运算符 对象 为什么不 C#- | 更新日期: 2023-09-27 18:15:40
如果我的问题看起来很愚蠢,很抱歉。
在C++中,此代码起作用:
Foo* foo = new Foo();
if (foo)
....;
else
....;
在C#中,这不起作用:
Object obj = new Object();
if (obj)
....;
else
....;
因为Object
类不能隐式转换为bool
(很明显,这没有问题(,而且它没有实现true
运算符。
所以我的问题是,为什么Object
不实现true
运算符(只需检查它本身是否为null,听起来很容易(?这仅仅是因为代码的可读性还是什么?
这是因为代码清晰。许多C#的设计选择都是为了让代码的编写方式一目了然
Object obj = ...;
if (obj)
....
if(obj)
是什么意思?是否检查obj
是否为真?是否正在检查是否为null
?是否正在检查是否为0
?浏览代码的人并不清楚这一点,因此程序员必须查阅C#文档来了解这种特定语法的作用。所以,C#让你说
Object obj = ...;
if (obj == null)
....
这样,你想做的事情就显而易见了
这也是为什么C#要求您实例化本地变量并声明它们,然后才能在代码中使用它们的原因。一个未实例化变量的值是不明确的,并且取决于编译器的配置,所以C#并没有强迫你进行研究或猜测,而是让你必须以明确意图的方式进行编码。
你的问题的基本答案是公认答案中给出的答案:因为C#的设计是为了避免,而不是延续C.的设计错误
但更具体地说:您会问为什么一个类型不实现operator true
。这个问题的答案是:operator true
的目的是实现短路&&
和||
运算符。由于不希望object
实现&
或&&
或|
或||
,因此没有理由实现operator true
或operator false
。
拳击。
当值被装箱时,如果涉及布尔值的条件语句做完全相反的事情,那将是非常令人困惑的。
你想要什么:
object o = false; // Yes, this is legal, it makes a boxed System.Boolean
if (o) { ... }
出于这个原因,在条件下测试类似bool的类型是可以的,但对于作为所有装箱值的基类的System.Object
则不可以。