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#-为什么不';t对象类具有true运算符

这是因为代码清晰。许多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 trueoperator false

拳击。

当值被装箱时,如果涉及布尔值的条件语句做完全相反的事情,那将是非常令人困惑的。

你想要什么:

object o = false; // Yes, this is legal, it makes a boxed System.Boolean
if (o) { ... }

出于这个原因,在条件下测试类似bool的类型是可以的,但对于作为所有装箱值的基类的System.Object则不可以。