2009-07-02 94 views
1

我想在內聯if語句中寫入lambda表達式。但是內聯if語句必須具有強類型結果。如何編寫強類型的lambda表達式?

MyType obj = someObj.IsOk ? null :() => { 
    MyType o = new MyType(intVal); 
    o.PropertyName = false; 
    return o; 
}; 

當然這不起作用,因爲lambda表達式不是強類型。我想到了使用Func<intVal, MyType>委託,使其成爲強類型。

但是,如何在內聯中使用此Func<>?是否有可能必須在外界定義我自己的函數,並在內聯if語句中使用它?

+0

好了,我不知道你是什麼將使用您保存的lambda(在本地使用它或將它傳遞給其他對象/方法)。如果你只在本地使用lambda,我想你應該可以用var關鍵字完成你的工作。 – 2009-07-02 21:16:49

+0

我改變了我的示例代碼。事情是我必須使用帶參數的構造函數,並設置其他屬性。所以對象初始值設定不考慮。 – 2009-07-02 21:59:41

回答

6

即使有更復雜的代碼,你可以使用一個對象初始化表達式:

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; 
}); 
6

這與lambda的打字沒有任何關係。您試圖返回null或(不帶參數並返回MyType的函數),但是您要告訴編譯器該語句的結果不是函數,而只是MyType。我想你想要做的是

MyType obj = someObj.IsOk ? null : new MyType(intVal); 
1

如果你有這樣的事情......

var obj = (someObj.IsOK) ? null :() => { 
      return new MyType(intVal) { PropName =false }; } 

你會得到錯誤...

「有null和lambda表達式之間沒有明確的轉換 。「

原因在這SO thread討論。

馬克是你想用什麼樣的代碼示例做,除了你可以設置類似的財產,以及這樣的正確的...

var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false }; 
相關問題