強く型付けされたラムダ式を書くためにどのように?
質問
私は、インラインif文の中にラムダ式を書きたいです。しかし、文が強いタイプの結果を持っている必要がありますインライン場合。
MyType obj = someObj.IsOk ? null : () => {
MyType o = new MyType(intVal);
o.PropertyName = false;
return o;
};
ラムダ式は強く型付けされていないため、もちろんこれは、動作しません。私はそれに強いタイプにするために、Func<intVal, MyType>
デリゲートを使用するのではと思っています。
しかし、どのように私は、インライン内のこのFunc<>
を使用していますか?それは可能な限り、私は外で私自身の関数を定義し、if文、インラインでそれを使用しなければならないのですか?
解決
さらに複雑なコードでは、オブジェクト初期化子式を使用することができます:
MyType obj = someObj.IsOk ? null : new MyType(intVal) { ProName = false };
は、をした場合、本当にはいえ、ラムダを使いたい、あなたが書くことができます:
MyType obj = someObj.IsOk ? null : ((Func<MyType>) (() => {
MyType o = new MyType(intVal);
o.ProName = false;
return o;
}))();
しかし、これは率直に言って、ブラケットとキャストのの悪夢のです。あなたはヘルパーメソッドで、それを簡単にすることができます:
public T Execute(Func<T> func)
{
return func();
}
...
MyType obj = someObj.IsOk ? null : Execute(() => {
MyType o = new MyType(intVal);
o.ProName = false;
return o;
});
他のヒント
ここはラムダのタイピングとは何の関係もありません。あなたはnull
か(関数は引数を取らないとがMyTypeを返す)のいずれかを返すようにしようとしているが、あなたはその文の結果は、関数が、ちょうどがMyTypeではないコンパイラを語っています。私はあなたが何をしたいのかを考えることです。
MyType obj = someObj.IsOk ? null : new MyType(intVal);
あなたはこのような何かを持っている場合...
var obj = (someObj.IsOK) ? null : () => {
return new MyType(intVal) { PropName =false }; }
あなたがエラーを取得します...
「明示的な変換はありません ヌルとラムダ式の間で。」
その理由はhref="https://stackoverflow.com/questions/263151/lambdas-and-the-ternary-operator-weird-issue"> SO のスレッドこの あなたにもこのような...
のようにプロパティを設定することができ除いマークが、あなたはコードサンプルで何をしようとしてで正しいです
var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };