变量'a'是引用类型,'A'是自定义类。当'a'的值为null时,为什么'a is A'结果为true?

问题描述 投票:0回答:1

文字版:

    var mirr = RecursedManager.instance.currentEntrance;

    if (mirr == null)
    {
        if (mirr is BoxExit)
        {
            var a = 1;

        }


    }

上图是C#调试时的截图。它显示执行到达“var a = 1”行。 既然已经到了这一行,就说明'mirr == null'和'mirr is BoxExit'这两个条件同时成立。我不明白为什么空值可以被判断为'BoxExit'类的子类.

我听过这样的解释:“变量包含类型信息,而 null 不包含”。这个结论也是我的第一反应。然而,我提供的一个简单的例子似乎与这个推理相矛盾。例如:

string aa = null;
bool b = aa is string;
print(b); // The output of b is false

最后,一些额外的信息(关于'currentEntrance'的定义,不确定是否需要):

public IEntrance currentEntrance { get => _instance._currentEntrance; set => _instance._currentEntrance = value; }


private IEntrance _currentEntrance;

其中“BoxExit”是我定义的自定义类,继承自Unity的“MonoBehaviour”类。此外,“BoxExit”类实现了“IEntrance”接口。

c# null typechecking
1个回答
0
投票

我们对

mirr
的类型一无所知,所以我们只能猜测,但 C# 类肯定有可能重写
==
运算符。

以下示例 (fiddle) 将输出

True
两次:

using System;

S s = new S();
Console.WriteLine(s == null);
Console.WriteLine(s is S);

class S
{
    public static bool operator==(S s1, S s2) => true;
    public static bool operator!=(S s1, S s2) => false;
}
© www.soinside.com 2019 - 2024. All rights reserved.