私は暗黙的にタプルを作成するときにパラメータに名前を付けることができることを知っています:
var me = (age: 21, favoriteFood: "Custard");
タプルが明示的に作成されるときにパラメーターに名前を付けることは可能ですか?つまり.
var me = new ValueTuple<int, string>(21, "Custard");
いいえ、できません。 ValueTuple
型は、実際にはC#の名前付きフィールドのサポートとは無関係です。後者は、匿名型の名前付きプロパティのように機能します。つまり、コンパイラはコードを分析し、宣言と使用法に従って適切なメンバーのエイリアスを生成します。コンパイラがフィールドの名前を学習するのは、割り当てを通してです。基本的なコンストラクター構文はフィールドに名前を付けるメカニズムを提供しないため、それを使用して名前付きフィールドを持つタプルを直接生成することはできません。
もちろん、コンストラクター構文から返された値を再解釈して、その戻り値に名前を割り当てる方法があります。私はあなたがそのアプローチを知っていて、より直接的なものを探していると仮定しています。
「再解釈」とはどういう意味かという例として、次のようなことができます。
static (int value, string text) ConvertToNamed((int value, string text) t)
{
return t;
}
次に、新しい変数でフィールドに名前を付けます。
var t1 = new ValueTuple<int, string>(21, "hello");
var t2 = ConvertToNamed(t1);
変数t1
は、Item1
およびItem2
でスタックしています。ただし、コンパイラは変数t2
に必要な名前を暗黙的に生成します。
より良い例は、追加のメソッドを必要としない場合です。
(int value, string text) t = new ValueTuple<int, string>(21, "hello");
繰り返しますが、実際にはコンストラクター構文でフィールドに名前を付けるのではなく、ローカル変数宣言によって再解釈されます。
これはおそらく深刻な制限ではありません。永続的で簡単に割り当てられる名前が必要なシナリオでは、とにかくTuple構文を使用するよりも、ユーザー定義型を宣言する方がおそらく良いでしょう。ユーザー定義型のデコンストラクタも作成できます。そのような型を宣言すると、リフレクションやdynamic
などに関して、名前が最上級の市民になります。