为什么此示例中的 testB 不像 testA 那样给出“警告 CS0184:给定的表达式永远不是提供的 ('MyClass2') 类型”?
class Program
{
void Main()
{
var a = new MyClass1();
var b = (IMyInterface)new MyClass1();
//Get a CS0184 Warning on this line
var testA = a is MyClass2;
//No warning on this line
var testB = b is MyClass2;
}
}
interface IMyInterface
{
}
class MyClass1 : IMyInterface
{
}
class MyClass2
{
}
因为
b
的类型是IMyInterface
。编译器不会分析代码来查找您分配给 b
的对象的实际类型。
IMyInterface
类型的变量可以是is MyClass2
。例如,如果 b
引用 MyClass3
的实例:
class MyClass3: MyClass2, IMyInterface {}
当然,如果
MyClass2
是 sealed
,则 MyClass3
不可能存在,因此在这种情况下 b
永远不可能是 is MyClass2
,并且您会收到预期的警告。