为扩展方法错误生成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
我的问题是:为什么编译器会建议出现NullReferenceException对Extension()
的第一次调用相当于第二次调用,但第二次不会产生警告。两个调用都应该是安全的,因为this string str
是一个参数,可以安全地为null,如第二行所示。我已经能够在3.5、4.0和4.5编译器上重现这一点,但不能在Mono 3.0.7上重现。
显然答案是肯定的,警告是不正确的。你已经很好地证明了这一点。(也许这就是它毕竟是一个警告的原因)
如前所述,调用具有null
值的扩展方法是无害的。我想编译器团队并没有通过所有的hussle来检查调用它的方法是否是扩展方法。
在第一种情况下,您正在取消引用一个null对象,在第二种情况下您正在调用一个带有null参数的方法。
===更新===
让我重申,是的,这似乎不是一个合理的警告。我怀疑编译器发出警告是因为它认为取消对null对象的引用是"错误的"。该警告可能早于扩展方法功能。
看看Roslyn是如何分解它的,会很有趣。