gpt4 book ai didi

c# - 为什么允许在 ‘is’ 运算符左侧使用方法组,如何在实践中使用它?

转载 作者:太空狗 更新时间:2023-10-29 19:46:47 25 4
gpt4 key购买 nike

首先“方法组是一组由成员查找产生的重载方法”。在我的示例中,我使用了一组具有 19 个重载的 Console.WriteLine 方法。

C# Language Specification 中方法组的定义还指出:“方法组允许在调用表达式(§7.6.5)、委托(delegate)创建表达式(§7.6.10.5)中并且作为 is 运算符的左侧,并且可以隐式转换为兼容的委托(delegate)类型(§6.6)。”

我能想到此功能可能有用的一种情况:

Action<string> print = (Action<string>)Console.WriteLine;
print("Hello!");

if (Console.WriteLine is Action<string>)
{
Console.WriteLine("We're compatible!");
}

前几行显示我们可以将方法组 Console.WriteLine ‘cast’ 到委托(delegate)中。实际发生的是“转换为兼容委托(delegate)类型的隐式转换”,它创建一个委托(delegate)实例,调用具有兼容签名的许多重载 Console.WriteLine 方法之一。

因此根据规范,我们可以使用上面提到的“is 运算符的左侧”功能来测试方法组是否与给定的委托(delegate)类型兼容(存在隐式转换)。这是示例代码中“if”语句中检查的内容。

令人惊讶的是,代码可以编译,但会给出警告“给定的表达式永远不是提供的 ('System.Action') 类型”。因此看起来不会尝试在运行时检查方法组和委托(delegate)类型的兼容性。

因此,我的问题:

  • 如果无法在运行时执行检查,为什么方法组允许位于“is”运算符的左侧?
  • 为什么这个构造给出警告而不是编译错误?
  • 在“is”运算符左侧使用方法组是否有任何实际场景?
  • 这是为将来使用保留的东西吗,即上面的代码预计有一天会起作用?

最佳答案

规范 (4.0) 明确指出了这种特定情况:

7.10.10 The is operator

[...] The result of the operation E is T where E is an expression and T is a type, is a boolean value [...]

到目前为止,还不错。规范继续:

If E is a method group [...] the result is false.

根据这些信息,让我们看看您的问题。

Why are the methods groups allowed on the left-side of ‘is’ operator if the check cannot be performed at runtime?

规范允许此操作。参见 Lippert's answer on another question关于这是怎么发生的。

Why this construct gives a warning and not a compilation error?

该结构在句法上是有效的,即使它的计算结果总是为假。警告只是为了让您知道您可能正在做一些意外的事情。

Are there any practical scenarios of using method groups on the left side of ‘is’ operator?

可能不会。也许如果您传递了一个对象,它可能是一个方法组或者可能是其他东西,这个构造可能是有用的。 (不可否认,这是一个人为的例子,委托(delegate)了一些严重值得怀疑的做法。)

Is this something reserved for future uses, i.e. it is envisaged that the code above will work someday?

没有。再次引用 Lippert 的话“让'M is D'突然开始返回真值或成为错误是一个突破性的变化。” [原文强调]

关于c# - 为什么允许在 ‘is’ 运算符左侧使用方法组,如何在实践中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32298128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com