多くの状況では、特定の場所で許可されるタイプは1つだけである。それでもC#では、型を明示的に表記する必要がある。もしターゲット型が定まっている「new」式の提案が採用されれば、そのような定型コードは必要なくなるであろう。
表面的には、この機能はvarキーワードの逆のように見える。しかし、式から変数の型を推測するのではなく、変数から式の型を推測する。以下は、現在の構文と提案されている構文を使用した提案例である。
Dictionary<string, List<int>> field = new Dictionary<string, List<int>>();
Dictionary<string, List<int>> field = new();
お分かりのように、文脈から推測できる場合は型を指定する必要がなくなる。ローカル変数の場合、これはあまり興味深くないが、便利なのは一時的にしか使わない変数に対してである。
XmlReader.Create(reader, new XmlReaderSettings() { IgnoreWhitespace = true });
XmlReader.Create(reader, new() { IgnoreWhitespace = true });
上記のコードでは、XmlReaderSettingsクラスは特筆すべきことはない。XmlReaderに渡すオプション値を単に保持するものである。XmlReaderSettingsという型名が重要な情報の邪魔になると言う人さえいるかもしれない。
この機能が役立つもう1つの場所は、varキーワードがオプションではないフィールドとプロパティである。例を次に示す。
private readonly static object s_syncObj = new();
提案によると、その使用には4つの例外がある。
- 列挙型: すべての列挙型が定数0を含むわけではないので、明示的なenumメンバを使用することが望ましい。
- インターフェース型: これはニッチな機能であり、型を明示的に記述することが好ましい。
- 配列型: 配列は長さを示すための特別な構文を必要とする。
- 構造体のデフォルトコンストラクタ: これはすべてのプリミティブ型とほとんどの値型とルールが異なる。そのような型のデフォルト値を使いたい場合は、代わりにdefaultを書くことができる。
ステータス
現在、Caller Expression AttributeはC# 8ロードマップにステータス 「Prototype」で表示されている。機能テスト計画はGitHubで確認できる。