首頁 > 後端開發 > C++ > 為什麼括號在某些 C# 物件初始化器中是可選的,但在其他物件初始化器中是必需的?

為什麼括號在某些 C# 物件初始化器中是可選的,但在其他物件初始化器中是必需的?

Mary-Kate Olsen
發布: 2025-01-15 13:37:43
原創
702 人瀏覽過

Why Are Parentheses Optional in Some C# Object Initializers but Required in Others?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板