3

この質問と同様にout、型を定義することなく、メソッドから暗黙的に型指定された変数にパラメーターをプルできるかどうかを確認することにしました。私の理想的なソリューションは次のようになります。

var result = LiftOutParam((out p1, out p2, out p3) => {
    return CallMyMethod(i1, i2, out p1, out p2, out p3);
});
var o1 = result.Item1;
var o2 = result.Item2;
var o3 = result.Item3;
var returnValue = result.Item4;

この場合、CallMyMethod2 つの通常の入力変数、3 つoutのパラメーター、および戻り値があります。に渡されたデリゲートのセマンティクスに基づいてo1、 、o2o3、およびの型をコンパイラが自動的に決定するようにします。そのため、出力パラメーターの組み合わせごとに、いくつかのヘルパー デリゲートとメソッドを作成しました。3 つのパラメーターの例を次に示します。returnValueLiftOutParamout

public delegate TReturn Lift<T1, T2, T3, TReturn>(
    out T1 o1, out T2 o2, out T3 o3);

public static Tuple<T1, T2, T3, TReturn> LiftOutParam<T1, T2, T3, TReturn>(
    Lift<T1, T2, T3, TReturn> Lift) {

    T1 o1;
    T2 o2;
    T3 o3;
    TReturn ret = Lift(out o1, out o2, out o3);
    return new Tuple<T1, T2, T3, TReturn>(o1, o2, o3, ret);
}

理論的には、コンパイラはデリゲートのセマンティクスに基づいて、、、、および型T1を判別できるはずです。ただし、デリゲートの各パラメーターの型を指定しない限り、上記のコードはコンパイルされません。T2T3TReturn(out p1, out p2, out p3) => { return CallMyMethod(i1, i2, out p1, out p2, out p3); }out

私が達成しようとしていることを行う方法はありますか? outどこでも型を明示的に定義しなくても、パラメーターの値を暗黙的に型指定されたローカル変数にプルできる汎用ヘルパー メソッドを作成するには?

4

2 に答える 2

2

ここには2つの問題があります。

  1. refラムダ式の1つ以上のパラメーターにorout修飾子が必要な場合、構文では、ラムダ式のすべてのパラメーターのタイプを指定する必要があります。これは構文上の問題であり、コンパイラが型を推測できたかどうかに関係なく適用されます。

  2. 推測するタイプが必要です。方法がある場合

    void MyMethod<T>(Action<T> action)
    {
    }
    

    この場合、このメソッドを次のように呼び出すことはできません。MyMethod(t => { });この場合、何であるかを推測する方法がないためTです。1つの特定のタイプであると推測するT 必要があります。MyMethodこれは、が呼び出されたときにスコープ内にある別のジェネリックパラメーターに依存するタイプである可能性があります。

于 2013-01-15T20:36:28.460 に答える
2

C# コンパイラは、メソッドが渡されたデリゲートからジェネリック型を推論できません。詳細はこちらC# 3.0 ジェネリック型推論 - デリゲートを関数パラメーターとして渡す. 通常のパラメータかref/outパラメータかは問いません。

関連する可能性があります: C# は、渡されたデリゲート/ラムダの戻り値の型を推論できません (.NET のジェネリック メソッドは、その戻り値の型を推論できません) で説明されています。なんで?.

于 2013-01-15T20:14:39.213 に答える