首先,“方法组是由成员查找产生的一组重载方法”。在我的例子中,我使用了具有19个重载的
C#语言规范中对方法组的定义还指出:“方法组可以在调用表达式(§7.6.5)、委托创建表达式(§7.6.10.5)和作为is运算符的左操作数中使用,并且可以隐式转换为兼容的委托类型(§6.6)。”
我可以想到一种场景,这种功能可能会很有用:
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”运算符左侧的实际情况?
- 这是为将来使用保留的内容吗?也就是说,上面的代码有一天会起作用吗?