RS-232C

産業界ではまだまだRS-232Cは現役です。
通信内容が単純でノイズにも強く、扱いやすい為です。

COMポートの通信内容を詳細に調べる必要があったので、
Microsoft純正のCOMポート監視ソフト「Portmon」を使いました。
残念ながら普段使用している64bit環境のOSには対応しておらず、
別の開発環境を準備して確認する事となりました。

少し前なら当たり前のようにできていた事が、
最新の開発環境では使い慣れたものが使えなかったり、
逆に不便だったりすると、とても残念な気持ちになります。

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

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で標準的に要素数の少ない分解が出来るようになってほしいと思うのですが、出来ないということは何かリスクがあるのでしょうかね。