You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何示例中testB未触发CS0184警告,而testA触发该警告?

为什么b is MyClass2不会触发CS0184警告?

先看对应的代码场景:

class Program
{
    void Main()
    {
        var a = new MyClass1();
        var b = (IMyInterface)new MyClass1();
        
        // 触发CS0184警告
        var testA = a is MyClass2;
        
        // 无警告
        var testB = b is MyClass2;
                
    }
}

interface IMyInterface
{
}

class MyClass1 : IMyInterface
{
}

class MyClass2
{
}

核心原因:

  • 变量a的编译时类型是具体类MyClass1,编译器能明确判断:MyClass1和MyClass2之间没有继承或实现关系,不存在任何可能让a的实际类型是MyClass2的情况,所以a is MyClass2的结果必然是false,直接抛出CS0184警告。
  • 变量b的编译时类型是接口IMyInterface,编译器无法在编译期穷尽所有实现该接口的类型。理论上存在其他类(比如后续新增的class MyClass3 : MyClass2, IMyInterface),这类实例既实现IMyInterface,同时又是MyClass2的子类或本身。编译器不能排除运行时b指向这类对象的可能性,因此不会触发警告。

内容的提问来源于stack exchange,提问作者innominate227

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:50:19