对象上的感叹号操作符

本文关键字:操作符 感叹 对象 | 更新日期: 2023-09-27 18:15:45

在c#中,下面的代码片段是做什么的?

1)

if (!object)
{
  //code
}

2)

if (object)
{
  //code
}

其中object是一个类的实例,并且绝对不是bool

1)在Java中,尝试上述代码将使编译器发出错误。只有布尔变量可以用作Condition_Block。

2)在c++中,if (!object){/**/}用于null检查。

3)在c#中,编译器不会发出错误并愉快地编译它。谷歌从来没有提到过!用于对象的操作符。它只给出bool值的搜索结果。此外,雪上加霜的是,它给出的结果是人们在谈论?和? ?操作符,这些操作可能在30-40年内不会提供给unity开发者。仅支持NET3.5 API。如果!操作符在c++中的工作原理,为什么人们需要?和? ? .

编辑:完整代码。

using UnityEngine;
using System.Collections;
public class Foo : MonoBehaviour
{
    void Start ()
    {
        Foo a = new Foo();
        if (a)  Debug.Log("a");
        if (!a) Debug.Log("b");
    }
 }

执行时输出"b"

对象上的感叹号操作符

在c#中有三种情况if (!object)会被编译:

  1. objectbool类型
  2. 如果object类型已经定义了implicit operator bool过载。
  3. 如果!操作符已经为object类型重载。

重载!的例子:

class Test
{
    public int Value;
    public static bool operator ! (Test item)
    {
        return item.Value != 0;
    }
}

然后:

Test test = new Test();
Console.WriteLine(!test); // Prints "False"
test.Value = 1;
Console.WriteLine(!test); // Prints "True"

在c#中有两种if (object)编译的情况:

  1. 如果objectbool类型,则
  2. object类型定义implicit operator bool过载。

implicit operator bool:

示例
class Test
{
    public int Value;
    public static implicit operator bool(Test item)
    {
        return item.Value != 0;
    }
}

然后:

Test test = new Test();
Console.WriteLine(!test); // Prints "True"
if (test)
    Console.WriteLine("This is not printed");
test.Value = 1;
Console.WriteLine(!test); // Prints "False"
if (test)
    Console.WriteLine("This is printed");