C# 语言设计 : method group inside `is` operator

标签 c# language-design method-group

我对 C# 语言的一些设计选择很感兴趣。 C# 规范中有一条规则允许使用方法组作为 is 的表达式。运算符(operator):

class Foo {
  static void Main() { if (Main is Foo) Main(); }
}

如规范所述,上述条件始终为假:

7.10.10 The is operator

If E is a method group or the null literal, of if the type of E is a reference type or a nullable type and the value of E is null, the result is false.

我的问题:允许在 CLR 中使用没有运行时表示的 C# 语言元素的目的/要点/原因是什么,例如 is 这样的“运行时”运算符中的方法组?

最佳答案

what is the purpose/point/reason of allowing to use the C# language element with no runtime representation in CLR like method groups inside the such "runtime" operator like is?

语言设计笔记存档没有提及做出此决定的原因,因此对答案的任何猜测都将是一种猜想。他们确实提到,如果可以静态地确定"is"的结果始终为真或假,那么确定它并产生警告。这似乎有可能只是一个错误。

将错误变成警告(或干脆允许)的最常见原因是,这减轻了自动生成代码的程序生产者的负担。但是,我在这里看不到真正令人信服的场景。

更新:

我刚刚检查了 C# 1.0 规范。它里面没有这种语言。它没有说明空值或方法组参数。当然,它没有提及方法组转换,因为在 C# 1.0 中没有隐式方法组转换;如果您想将方法 M 转换为委托(delegate)类型 D,则必须显式调用“new D(M)”。

后一点是“M is D”返回 false 而不是 true 的理由;你不能合法地说“D d = M;”那么为什么“M 是 D”应该是真的?

当然在 C# 2.0 中这没有什么意义,因为您可以说“D d = M;”在 C# 2.0 中。

我还刚刚问了一位在场的人,他是什么时候设计"is"运算符的,他不记得曾经以这种或那种方式决定过这个问题。他怀疑“is”运算符的原始设计是不给出任何错误,仅给出警告,并且规范中关于如何处理方法组和空值以及诸如此类的内容的所有文本都是事后添加的,因为C# 2.0 版本的规范,基于编译器实际执行的操作。

简而言之,这看起来像是 C# 1.0 中的一个设计漏洞,在为 C# 2.0 更新规范时被掩盖了。这种特定行为看起来不像是期望和有意实现的。

匿名方法在 C# 2.0 中用作“is”的参数时确实会产生错误,这一事实进一步证实了这一理论。这样做不会是重大更改,但会是使“M is D”突然开始返回 true 或成为错误的重大更改。

进一步更新:

在调查这个过程中,我学到了一些有趣的东西。 (对我而言。)最初设计此功能时,设计是允许类型名称​​或类型对象作为“is”的右侧参数。不过,在 C# 1.0 发布之前,这个想法就被放弃了。

关于C# 语言设计 : method group inside `is` operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28020857/

相关文章:

c# - 停止重新锐化按字母顺序排序的字段?

c# - 如何执行WinAppDriverUiRecorder

c# - 来自 PHP 示例的 UWP HttpClient 授权

java - 为什么 HttpRequest.HttpMethod 是字符串而不是枚举?

c++ - 为什么为const std::vector定义了operator [],而没有为const std::map定义了operator []?

Python 数学正则表达式

c# - 方法推断不适用于方法组

c# - 从 HTTPRuntime 缓存中检索图像

c# - 使用 分配委托(delegate)时出错? : Syntax

c# - 为什么 C# 编译器在将方法组作为参数传递时不解析仅返回类型不同的委托(delegate)类型?