我对此进行了破解,虽然我在 MSDN 参考中找不到它,但似乎 is 操作符依赖于实例化一个能够检查的类型。由于静态类不能被实例化(因为静态类是在编译时在程序堆栈上创建的对象)......
例如,如果您执行以下操作,则会收到以下错误:“无法声明静态类型的变量”
ExtensionMethods ex;
如果您执行以下操作,您也不会收到以下错误:“无法创建静态类的实例”
ExtensionMethods ex2 = new ExtensionMethods();
为了演示这个问题,这里有一个完整的程序,显示了 is 运算符。
static class ExtensionMethods { }
// notice non-static
class AnotherNonStaticExtensionMethod { }
class Program
{
static void Main(string[] args)
{
Debug.WriteLine(Test(new AnotherNonStaticExtensionMethod()).ToString());
Debug.WriteLine(Test("Test").ToString());
Debug.WriteLine(Test(4).ToString());
}
public static bool Test(object obj)
{
if (obj is ExtensionMethods)
{
return true;
}
else if (obj is AnotherNonStaticExtensionMethod)
{
return true;
}
else
{
return false;
}
}
}
这是以下输出:
True
False
False
is 对象能够使用第一条语句检查可实例化的类——因此让我相信 is 运算符依赖于它。我希望有人可以证实这一点?
由 NominSim 提供::
从 C# 3.0 规范,第 10.1.1.3 节:
静态类可能不包括基于类的规范(第 10.1.4 节),并且不能显式指定基类或已实现接口的列表。静态类隐式继承自类型对象。