没有 CS0184 不可能检查的警告

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

为什么此示例中的 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
{
}
c# roslyn compiler-warnings
1个回答
0
投票

因为

b
的类型是
IMyInterface
。编译器不会分析代码来查找您分配给
b
的对象的实际类型。

IMyInterface
类型的变量可以是
is MyClass2
。例如,如果
b
引用
MyClass3
的实例:

class MyClass3: MyClass2, IMyInterface {}

当然,如果

MyClass2
sealed
,则
MyClass3
不可能存在,因此在这种情况下
b
永远不可能是
is MyClass2
,并且您会收到预期的警告。

© www.soinside.com 2019 - 2024. All rights reserved.