【发布时间】:2015-11-24 17:07:41
【问题描述】:
首先“方法组是一组通过成员查找产生的重载方法”。在我的示例中,我使用了一组具有 19 个重载的 Console.WriteLine 方法。
C# 语言规范中方法组的定义还指出:“方法组允许在调用表达式 (§7.6.5) 、委托创建表达式 (§7.6.10.5) 并且作为 is 运算符的左侧,可以隐式转换为兼容的委托类型(第 6.6 节)。”
我可以想到这个功能可能有用的一种场景:
Action<string> print = (Action<string>)Console.WriteLine;
print("Hello!");
if (Console.WriteLine is Action<string>)
{
Console.WriteLine("We're compatible!");
}
前几行表明我们可以将方法组Console.WriteLine“强制转换”为委托。实际发生的是“转换为兼容委托类型的隐式转换”,它创建一个委托实例,调用具有兼容签名的许多重载 Console.WriteLine 方法之一。
所以根据规范,我们可以使用上面提到的“is 运算符的左侧”功能来测试方法组是否与给定的委托类型兼容(存在隐式转换)。这是示例代码中的“if”语句中检查的内容。
令人惊讶的是,代码编译了,但给出了警告“给定的表达式永远不是提供的 ('System.Action') 类型”。所以看起来不会在运行时尝试检查方法组和委托类型的兼容性。
因此,我的问题:
- 如果无法在运行时执行检查,为什么在“is”运算符左侧允许方法组?
- 为什么这个结构会给出警告而不是编译错误?
- 有没有在‘is’运算符左侧使用方法组的实际场景?
- 这是为将来使用而保留的东西吗,即设想上面的代码有一天会起作用?
【问题讨论】:
-
@Eric Lippert 已经在“The C# Programming Language”一书中写道:“
is运算符左侧的方法组是合法的,这有点误导。结果is的评估将始终为false,即使方法组是可转换为右侧的类型”。见books.google.co.il/…