C# では、次のようなクラスを作成できます。
class MyClass {
public void DoStuff();
}
このクラスを次のように初期化できます。
MyClass mc = new MyClass();
または:
MyClass mc = new MyClass { };
かっこが必要なく、オブジェクト初期化子によって設定されるプロパティがない場合、これを行うことができないのはなぜですか?
MyClass mc = new MyClass;
C# では、次のようなクラスを作成できます。
class MyClass {
public void DoStuff();
}
このクラスを次のように初期化できます。
MyClass mc = new MyClass();
または:
MyClass mc = new MyClass { };
かっこが必要なく、オブジェクト初期化子によって設定されるプロパティがない場合、これを行うことができないのはなぜですか?
MyClass mc = new MyClass;
MyClass mc = new MyClass言語のパーサーの設計者がそれを許可しないと決定したため、それを行うことはできません。実際、彼らは中かっこの空のペアを許容することにかなり寛大でした: 少なくとも 1 つの式を明示的に要求するよりも、そのルートを取る方が簡単だったと思います。
あなたが提案している式の構造には、そのような構文を禁止する固有のものは何もありませんnew: 3 番目の選択肢をサポートするようにパーサーを変更するのに、それほど労力はかかりません。ただし、これを行うと、引数を持たない非コンストラクター メソッドの呼び出しとの矛盾が生じます。現在、括弧を省略すると、特定のコンテキストで有効な特定のセマンティックを持つメソッド グループになります。構文マーカーがないため、引数なしのメソッド呼び出しを括弧なしで許可するようにパーサーを変更するのは困難です (コンストラクターを呼び出すとき、newキーワードはそのようなマーカーの役割を果たすことに注意してください)。
構文new MyClass { }は新しいパラメーターなしのコンストラクター構文であるため、. を省略できます()。コンストラクター メソッドpublic MyClass()は、推論によって呼び出されます。
しかし、この構文new MyClassは、コンパイラが有効なものとして受け入れないため、単に悪いものです。
彼らはそれができなかったわけではありません。彼らはコンパイラでほぼ何でもできますが、それを行っていません。
このことを考慮:
public class MyClass {
public int Value { get; private set; }
public MyClass With(int i) {
Value = i;
return this;
}
}
MyClass my = new MyClass().With(5); // Old-school
MyClass my1 = new MyClass { }.With(6); // Kind of funky looking, but okay.
MyClass my2 = new MyClass.With(4); // This looks just like a static method call except for the new
MyClass はクラス名/タイプであり、 MyClass() はコンストラクターであるためです。呼び出す必要がある (したい) のはコンストラクターです。
これは、オブジェクトを初期化するためにデフォルトのコンストラクターを呼び出しているためです。そのため、次を使用します。
MyClass mc = new MyClass();
デフォルトのコンストラクター (引数の数がゼロ) が存在しない場合は、この行で「デフォルトのコンストラクターが存在しません」などのエラーが表示されます。