web-dev-qa-db-ja.com

新規作成時にValueTupleプロパティに名前を付ける

私は暗黙的にタプルを作成するときにパラメータに名前を付けることができることを知っています:

var me = (age: 21, favoriteFood: "Custard");

タプルが明示的に作成されるときにパラメーターに名前を付けることは可能ですか?つまり.

var me = new ValueTuple<int, string>(21, "Custard");
19
BanksySan

いいえ、できません。 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などに関して、名前が最上級の市民になります。

26
Peter Duniho