Der Grund, warum der C#-Objektinitialisierer das Weglassen von Konstruktorklammern zulässt
C# 3.0 führte Objektinitialisierer ein, deren optionale Syntax es ermöglicht, die Klammern im Konstruktor wegzulassen, wenn der Konstruktor über einen Konstruktor ohne Parameter verfügt. Wie der ehemalige C#-Compiler-Teamleiter Mads Torgersen erklärt, hat diese Funktion mehrere Vorteile:
Designüberlegungen:
Technische Umsetzung:
Mehrdeutigkeiten vermeiden:
Während Klammern in Objektinitialisierern weggelassen werden dürfen, sind sie in Objekterstellungsausdrücken ohne Objektinitialisierer dennoch erforderlich. Dies liegt daran, dass das Weglassen von Klammern in diesem Fall zu Mehrdeutigkeiten führen kann, wie im folgenden Beispiel:
<code class="language-csharp">class P { class B { public class M { } } class C : B { new public void M(){} } static void Main() { // 调用默认构造函数,然后是方法 M new C().M(); // 1 // 使用默认构造函数创建一个新的 B.M 实例 new C.M(); // 2 } }</code>
Wenn Sie die optionalen Klammern in Zeile 1 weglassen, kann der Compiler nicht bestimmen, ob er den Standardkonstruktor von C aufrufen oder eine neue B.M-Instanz erstellen soll. Dies führt zu semantischen Mehrdeutigkeiten und möglichen Fehlern.
Optionale Konstruktorklammern sind daher auf Objektinitialisierer beschränkt, deren Weglassung kein Risiko für die Syntax oder Semantik der Sprache darstellt.
Das obige ist der detaillierte Inhalt vonWarum sind optionale Konstruktorklammern in C#-Objektinitialisierern zulässig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!