C# 3.0 对象初始化器构造函数中括号的可选性
在 C# 3.0 中,使用对象初始化器语法初始化对象时,如果构造函数没有任何参数,则可以省略构造函数周围的圆括号。这是因为类型名称后的花括号表示对象初始化器的开始。
设计考量
使括号可选的决定是由几个因素驱动的,包括:
歧义考量
虽然可选括号在对象初始化器上下文中没有任何问题,但如果将其应用于没有对象初始化器的默认构造函数调用,则会引入歧义。考虑以下代码:
<code class="language-c#">class P { class B { public class M { } } class C : B { new public void M(){} } static void Main() { new C().M(); // 1 new C.M(); // 2 } }</code>
第 1 行创建一个新的 C 对象并调用实例方法 M。第 2 行创建一个新的 B.M 对象并调用其构造函数。如果第 2 行的括号是可选的,程序将变得模棱两可,因为不清楚 C.M 是否指的是 C 的构造函数还是 B 中嵌套的类 M。
基于启发式的消除歧义
为了解决潜在的歧义,编译器使用启发式方法来确定代码的意图。例如,如果存在与点标识符同名的类型、字段或方法,则点标识符被认为是指该成员。但是,使用的启发式方法并不总是能导致预期的解释,尤其是在复杂的代码中。
以上是为什么 C# 3.0 对象初始值设定项中的括号是可选的?的详细内容。更多信息请关注PHP中文网其他相关文章!