没有 CS0184 警告不可能检查

inn*_*227 1 c# compiler-warnings roslyn

为什么本示例中的 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
{
}
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 6

因为 的类型bIMyInterface. 编译器不会分析代码来查找您分配给的对象的实际运行时类型b

类型变量可以IMyInterfaceis MyClass2。例如, ifb引用以下实例MyClass3

class MyClass3: MyClass2, IMyInterface {}
Run Code Online (Sandbox Code Playgroud)

当然,如果MyClass2sealedMyClass3则不能存在,因此在这种情况下b永远不会存在is MyClass2,并且您会按预期收到警告。

这也是为什么可以将非密封类类型的表达式强制转换为任何接口类型,例如

var a = new MyClass2();
// this compiles, but throws an exception at runtime, of course
var b = (IMyInterface)a;
Run Code Online (Sandbox Code Playgroud)

即使MyClass2没有实现IMyInterface,在运行时它也可能引用某个实现IMyInterface的子类。