[英]How to write strongly typed lambda expressions?
我想在一個內聯if語句中編寫一個lambda表達式。 但是內聯if語句必須具有強類型結果。
MyType obj = someObj.IsOk ? null : () => {
MyType o = new MyType(intVal);
o.PropertyName = false;
return o;
};
當然這是行不通的,因為lambda表達式不是強類型的。 我想到了使用Func<intVal, MyType>
委托使其成為強類型。
但是,如果Func<>
內如何使用此Func<>
呢? 是否有可能我必須在外部定義自己的函數並在if語句內聯中使用它?
這與lambda的輸入無關。 您試圖返回null
或(不帶任何參數並返回MyType的函數),但您要告訴編譯器該語句的結果不是函數,而只是MyType。 我想你想做的是
MyType obj = someObj.IsOk ? null : new MyType(intVal);
即使使用更復雜的代碼,也可以使用對象初始化器表達式:
MyType obj = someObj.IsOk ? null : new MyType(intVal) { ProName = false };
如果確實要使用lambda,則可以編寫:
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;
});
如果你有這樣的事情...
var obj = (someObj.IsOK) ? null : () => {
return new MyType(intVal) { PropName =false }; }
您將收到錯誤信息...
“在null和lambda表達式之間沒有顯式轉換。”
其原因在本SO線程中進行了討論。
Mark可以正確處理您的代碼示例,但您可以像這樣設置屬性...
var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.