2012-02-14 40 views
5

我實現使用DLR在C#語言解釋器,我有一些麻煩與三元運算符。在這一點上,我有基本的函數聲明/調用來實現,就像這樣:如何實現三元運算符在DLR

F := (x) -> x + 1 
F(1) # returns 2 

我已經沒有用一個函數體是一個表達式序列的問題 - 最後一個表達式的值總是返回,而且我確信所有的情況在解釋回報至少東西的副作用。我現在試圖實現三元運算符(?:)。表達式樹我的渲染看起來像這樣:

work = Expression.IfThenElse(         
    Expression.IsTrue(Expression.Convert(work, typeof(Boolean))), 
    trueExp, 
    falseExp); 

其中trueExp和falseExp都是有效的表達式。

問題似乎是IfThenElse表達式沒有返回值,所以基本上即使trueExp和falseExp正在構建表達式樹,IfThenElse表達式的最終結果始終爲空。通過使用DLR實現三元運算符,有沒有辦法制作運行時函數並明確調用它? (即:?表達式,做了IfThenElse和真假子句返回的實際值)

我希望解析是一樣的東西:

F := (x) -> (x = 1) ? 4 : 5 
F(1) #4 
F(2) #5 

但現在這個總是返回null當編譯成一個程序時,由於上述問題。

我會很感激任何幫助,這是很讓人頭疼的!

回答

14

Expression.IfThenElseif (...) ... else ...;構建體,而不是三元運算符。

三元運算符是Expression.Condition

+0

完美!謝謝 – Gakidou 2012-02-14 19:35:18

+0

是否有可能效仿Expression.Condition與Expression.IfThenElse?即不是「回報? b:c'do'if(as)return b else return c;'? – 2013-05-07 07:23:18

+0

@zespri:如果你想要做的就是返回一個值,當然。在那種情況下,他們是一樣的。顯然你不能在另一個表達式中使用IfThenElse *,因爲它是一個聲明。我個人覺得'返回一個? b:c;'但是更容易理解。 – 2013-05-07 13:24:56