12


0

C#-「out」パラメーターをラムダ式に渡す方法

次のシグネチャを持つメソッドがあります。

private PropertyInfo getPropertyForDBField(string dbField, out string prettyName)

その中で、指定された「dbField」に基づいて関連する値「prettyName」を見つけます。 次に、「prettyName」という名前のプロパティがある場合はそれをすべて検索したいので、次のことをしようとしています:

IEnumerable matchingProperties =
    getLocalProperties().Where(prop =>
        prop.Name.Equals(prettyName)
    );

ただし、これにより次のエラーが発生します。

_ 匿名メソッド、ラムダ式、またはクエリ式内でrefまたはoutパラメーター「prettyName」を使用できません _

「Where」ラムダパラメータで「prettyName」を使用しようとしているメソッドのポイントまでに、「prettyName」は確実に初期化されます。 「prettyName」を有効な値に初期化できない場合は「return」します。 ラムダ式で「prettyName」を使用できるようにするために、ここでできるトリックはありますか?

*編集:*問題があれば.NET 3.5を使用しています。

2 Answer


17


コンパイラエラーが示すように、ラムダ式内でoutまたはrefパラメーターを使用することは許可されていません。

なぜコピーを使用しないのですか? とにかくラムダが変数を変更したいわけではないので、マイナス面はありません。

string prettyNameCopy = prettyName;
var matchingProperties = getLocalProperties()
                        .Where(prop => prop.Name == prettyNameCopy);

または、(適切な名前などを評価するために)ローカル全体を使用し、メソッドから戻る直前に「out」パラメーター「prettyName」を割り当てることができます。 メソッド内に重要な分岐がなければ、これはおそらくより読みやすくなります。


17


明確にするためだけに。 ラムダで呼び出されたメソッドからref / out引数を使用することが可能です。

パラメーターのタイプを指定する場合は、refまたはoutを使用することもできます。 つまり、prettyNameをパラメーターとしてラムダに送信します。

(prop, ref string prettyName) => prop.Name.Equals(prettyName);

Where句は、リスト内のプロパティ要素である1つの引数のみを取ります。 これにより、ラムダに引数を追加できなくなります。

これらの引数をラムダで使用できないという誤った印象を人々に残したくありませんでした。 キャプチャで使用することはできません。