17

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

private PropertyInfo getPropertyForDBField(string dbField, out string prettyName)

prettyNameその中で、与えられたに基づいて関連する値を見つけますdbField。次に、名前が付いているすべてのプロパティを検索したいprettyNameので、次のことを実行しようとしています。

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

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

匿名メソッド、ラムダ式、またはクエリ式内でrefまたはoutパラメータ'prettyName'を使用することはできません

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

編集:重要な場合は.NET3.5を使用しています。

4

2 に答える 2

29

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

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

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

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

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

于 2012-08-08T13:43:10.967 に答える
20

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

コピーを使ってみませんか?とにかくラムダが変数を変更したいとは思わないので、マイナス面は見られません。

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

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

于 2010-10-28T18:04:13.023 に答える