C# 物件初始化器建構子中括號的可選性:原因及歧義消除
在 C# 3.0 中,如果存在無參數建構函數,則物件初始化器建構函數允許省略括號。此功能的添加基於以下幾個因素:
預設建構子呼叫中括號的缺失
然而,在沒有物件初始化器的物件建立表達式中,預設建構函式呼叫中的括號仍然是必需的。此限制是為了避免歧義。例如,在以下程式碼中:
<code class="language-csharp">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 的實例並觸發其預設建構子。如果第 1 行的括號是可選的,則第 2 行將產生歧義,因為它也可以指 C.M。
歧義偵測方法
確定 C# 功能中的歧義涉及幾種方法:
潛在歧義的例子
考慮新增一個新的前綴運算子「frob」:
<code class="language-csharp">x = frob 123 + 456;</code>
這可以解釋為對 123 456 的結果執行 frob 運算,或將 10 賦值給名為 x 的 frob 類型變數。
在另一個範例中,C# 2.0 中的以下表達式是模稜兩可的:
<code class="language-csharp">yield(x);</code>
它可以表示在迭代器中產生 x,也可以表示使用 x 作為參數來呼叫 yield 方法。透過將其修改為“yield return(x)”,消除了歧義。
以上是為什麼括號在某些 C# 物件初始化器中是可選的,但在其他物件初始化器中是必需的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!