ターゲット型の "default" リテラルTarget-typed "default" literal

  • [x] が提案されています[x] Proposed
  • [x] プロトタイプ[x] Prototype
  • [x] 実装[x] Implementation
  • [] 仕様[ ] Specification

まとめSummary

ターゲット型指定 default された機能は、演算子の短い形式のバリエーションであり、 default(T) 型を省略できます。The target-typed default feature is a shorter form variation of the default(T) operator, which allows the type to be omitted. その型は、代わりにターゲット入力によって推論されます。Its type is inferred by target-typing instead. それ以外の場合は、のように動作 default(T) します。Aside from that, it behaves like default(T).

目的Motivation

主な動機は、冗長な情報を入力しないようにすることです。The main motivation is to avoid typing redundant information.

たとえば、を呼び出すと、 void Method(ImmutableArray<SomeType> array) の代わりに 既定 のリテラルが許可され M(default) M(default(ImmutableArray<SomeType>)) ます。For instance, when invoking void Method(ImmutableArray<SomeType> array), the default literal allows M(default) in place of M(default(ImmutableArray<SomeType>)).

これは、次のようなさまざまなシナリオで適用されます。This is applicable in a number of scenarios, such as:

  • ローカル変数の宣言 ( ImmutableArray<SomeType> x = default; )declaring locals (ImmutableArray<SomeType> x = default;)
  • 三項演算 ( var x = flag ? default : ImmutableArray<SomeType>.Empty; )ternary operations (var x = flag ? default : ImmutableArray<SomeType>.Empty;)
  • メソッドとラムダ () を返す return default;returning in methods and lambdas (return default;)
  • 省略可能なパラメーターの既定値の宣言 ( void Method(ImmutableArray<SomeType> arrayOpt = default) )declaring default values for optional parameters (void Method(ImmutableArray<SomeType> arrayOpt = default))
  • 配列作成式 () に既定値を含める var x = new[] { default, ImmutableArray.Create(y) };including default values in array creation expressions (var x = new[] { default, ImmutableArray.Create(y) };)

詳細なデザインDetailed design

新しい式が導入されました。 既定 のリテラルです。A new expression is introduced, the default literal. この分類の式は、 既定のリテラル変換 によって、任意の型に暗黙的に変換できます。An expression with this classification can be implicitly converted to any type, by a default literal conversion.

既定 のリテラルの型の推論は、 null リテラルの場合と同じように動作します。ただし、参照型だけでなく、任意の型が許可される点が異なります。The inference of the type for the default literal works the same as that for the null literal, except that any type is allowed (not just reference types).

この変換により、推定される型の既定値が生成されます。This conversion produces the default value of the inferred type.

既定 のリテラルは、推論された型に応じて定数値を持つことができます。The default literal may have a constant value, depending on the inferred type. したがっ const int x = default; て、は有効ですが、は有効で const int? y = default; はありません。So const int x = default; is legal, but const int? y = default; is not.

既定 のリテラルは、他のオペランドが型を持つ限り、等値演算子のオペランドにすることができます。The default literal can be the operand of equality operators, as long as the other operand has a type. したがっ default == x て、と x == default は有効な式ですが、 default == default 無効です。So default == x and x == default are valid expressions, but default == default is illegal.

デメリットDrawbacks

小さな欠点は、ほとんどのコンテキストで 既定 のリテラルを null リテラルの代わりに使用できることです。A minor drawback is that default literal can be used in place of null literal in most contexts. 2つの例外は throw null; とです null == null 。これは、 null リテラルで許可されますが、 既定 のリテラルには使用できません。Two of the exceptions are throw null; and null == null, which are allowed for the null literal, but not the default literal.

代替Alternatives

考慮すべき選択肢がいくつかあります。There are a couple of alternatives to consider:

  • 現状では、この機能は独自のメリットには合わないため、開発者は、明示的な型で既定の演算子を引き続き使用します。The status quo: The feature is not justified on its own merits and developers continue to use the default operator with an explicit type.
  • Null リテラルを拡張する: これは、を使用した VB の手法です NothingExtending the null literal: This is the VB approach with Nothing. 許可することもでき int x = null; ます。We could allow int x = null;.

未解決の質問Unresolved questions

  • [x]は、is 演算子または as 演算子のオペランドとして 既定 で許可されますか?[x] Should default be allowed as the operand of the is or as operators? 回答: 許可 default is T しない、許可 x is default 、許可 default as RefType (常に null 警告を含む)Answer: disallow default is T, allow x is default, allow default as RefType (with always-null warning)

会議のデザインDesign meetings