文字版:
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”接口。
我们对
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;
}