タプル戻り値の要素数を増やす方法

C#7で追加されたタプル(ValueTuple)によって戻り値を複数返すことが出来るようになりました。


■タブルを使用した戻り値の例

public (bool b, string s) GetTuple() {
    return (true, "AAA");
}

public void Sample() {
    var (b, s) = GetTuple();
}

ここで1つ疑問が出てきました。機能追加によってGetTupleメソッドの戻り値を1つ増やしたいが、GetTupleメソッドを使用しているコードを変更したくない場合、どうすれば良いのか。

まず、バイナリ互換性を維持するのであれば、オーバーロードで複数のGetTupleメソッドを作成する方法が思いつきます。


■GetTupleメソッドのオーバーロード例 ビルド出来ません。

public (bool b, string s) GetTuple() {
    return (true,"AAA");
}

public (bool b, string s,string s2) GetTuple() {  
    return (true, "AAA","BBB");
}

public void Sample() {
    var (b, s) = GetTuple();
}

しかし、これではうまく行かないです。
C#は戻り値違いによるオーバーロードは出来ないからです。
引数を変えるか、メソッド名を変える必要があります。

次に、タプル(ValueTuple)を分解する拡張メソッドを作成し、3要素のタプルから2要素だけ分解する方法を考えました。


■分解拡張メソッド(Deconstruct)の例 ビルド出来ません。

public (bool b, string s,string s2) GetTuple() {
    return (true,"AAA","BBB");
}

public void Sample() {
    var (b, s) = GetTuple(); 
}

↓この分解拡張メソッドはstaticクラスに実装
public static void Deconstruct<T1, T2, T3>(this System.ValueTuple<T1, T2, T3> tuple, out T1 v1, out T2 v2) {
    v1 = tuple.Item1;
    v2 = tuple.Item2;
}

分解拡張メソッドは複数実装できるはずなのですが、なぜか追加した分解拡張メソッドは呼び出されませんでした。

結果、どの方法もうまくいきませんでした。
.netで標準的に要素数の少ない分解が出来るようになってほしいと思うのですが、出来ないということは何かリスクがあるのでしょうかね。

コメントを残す