プログラムに新しい値セットを導入することが理にかなっている場合は、新しいタイプを作成するのが良いと思います。たとえば、複雑な電卓を作成している場合は、複素数型を作成します。いくつかの変数を少しの間「接着」したいだけの場合は、タプルの方がおそらく良い選択です。コンソールから2つの数値を収集する単純な関数があるとしましょう...次のようなことを行うことができます。
static void GetNumbers(out int x, out int y) { ... }
...
int x, y;
GetNumbers(out x, out y);
通常、「getter」関数に戻り値がある場合は理にかなっていると思いますが、この場合は、実際には2つの戻り値を持つことができないため、意味がありません。TwoNumbersという新しいタイプを作成して使用することもできますが、これは解決策というよりもすぐに問題になると思います。C#にタプルがある場合、次のようなことができる可能性があります。
static (int, int) GetNumbers() { ... }
...
int x, y;
(x, y) = GetNumbers();
ここで本当に興味深い質問は、C#にはこの機能がありませんが、ライブラリを使用して自分で実装できるかどうかです。あなたが提案するコードは始まりですが、2番目の例で行ったように割り当てることはできません。C#についてはよくわかりませんが、C ++では、戻り値が参照型の場合に関数呼び出しを代入演算子の左オペランドにすることができるという事実を利用することで、これに非常に近づけることができます。次のことを考慮してください。
// this class is implemented much like yours only with C++
template<typename T1, typename T2> class tuple { ... }
...
template<typename T1, typename T2> tuple<T1, T2>& tie(T1 a, T2 b) { ... }
...
template<typename T1, typename T2> tuple<T1, T2> get_numbers() { ... }
...
int x, y;
tie(x, y) = get_numbers();
私はそれがかなり近いと思います...(x, y) =
私たちが持っている代わりにtie(x, y) =
。実装の詳細に興味がある場合は、私が最初にこれについて学んだTR1ライブラリを参照してください。
http://www.boost.org/doc/libs/1_41_0/libs/tuple/doc/tuple_users_guide.html#tiers
したがって、これらすべてをC#3.0に戻すために...あなたが示したように、確かにジェネリックタプルクラスを作成できますが、C#でタプルを「解凍」するためのtieのような関数を作成できますか?私はそれを試していません、楽しそうですね。そのようなものがなければ、C#タプルライブラリをコード全体で増殖させるのは気が進まないでしょう。