为扩展方法错误生成CS1720警告

本文关键字:CS1720 警告 错误 扩展 方法 | 更新日期: 2023-09-27 18:28:27

考虑以下程序:

static class Program
{
    static void Extension(this string str)
    {
        if(str == null)
            Console.WriteLine("String is null");
        else
            Console.WriteLine("String is not null");
    }
    static void Main(string[] args)
    {
        default(string).Extension();    // <--- warning
        Extension(default(string));     // <--- no warning
    }
}

输出如预期:

String is null
String is null

但是,C#编译器在第一行上给出了CS1720警告:

警告CS1720:表达式将始终导致System.NullReferenceException,因为"string"的默认值为null

我的问题是:为什么编译器会建议出现NullReferenceExceptionExtension()的第一次调用相当于第二次调用,但第二次不会产生警告。两个调用都应该是安全的,因为this string str是一个参数,可以安全地为null,如第二行所示。我已经能够在3.5、4.0和4.5编译器上重现这一点,但不能在Mono 3.0.7上重现。

为扩展方法错误生成CS1720警告

显然答案是肯定的,警告是不正确的。你已经很好地证明了这一点。(也许这就是它毕竟是一个警告的原因)

如前所述,调用具有null值的扩展方法是无害的。我想编译器团队并没有通过所有的hussle来检查调用它的方法是否是扩展方法。

在第一种情况下,您正在取消引用一个null对象,在第二种情况下您正在调用一个带有null参数的方法。

===更新===

让我重申,是的,这似乎不是一个合理的警告。我怀疑编译器发出警告是因为它认为取消对null对象的引用是"错误的"。该警告可能早于扩展方法功能。

看看Roslyn是如何分解它的,会很有趣。