我正在嘗試使用表達式來創建它:
bool.Parse("true") ? default(int?) : 1
順便說bool.Parse("true")
,我正在使用bool.Parse("true")
只是為了讓VS不要抱怨無法訪問的代碼路徑,所以假設它使用常量true
。當我寫這樣的表達時......
Expression.Condition(Expression.Constant(true), Expression.Default(typeof(int?)),
Expression.Constant(1))
...我得到的錯誤Argument types do not match
。我很確定我知道發生了什麼,所以我改變了我的表達方式來做到這一點:
Expression.Condition(Expression.Constant(true), Expression.Default(typeof(int?)),
Expression.New(typeof(int?).GetConstructor(new[] { typeof(int) }), Expression.Constant(1)));
它有效,但我不能說我喜歡寫一個與此相當的表達式:
bool.Parse("true") ? default(int?) : new int?(1)
有沒有辦法讓這個三元表達式工作而不創建一個新的int?
實例int?
?也許這樣做是可以的,因為c#在我的具體例子中隱含地創建了一個新實例?
編輯
我應該注意,我只使用Expression.Constant()
來模擬MethodCallExpression
的返回值,以簡化我的代碼示例。因此,任何暗示使用常數值作為解決方案的東西在這種情況下都不起作用。
您可以創建一個強制轉換,而不是使用new
創建一個實例,即
bool.Parse("true") ? default(int?) : (int?)(1)
喜歡這個:
Expression.Condition(
Expression.Constant(true)
, Expression.Default(typeof(int?))
, Expression.Convert(Expression.Constant(1), typeof(int?))
)
鍵入常量表達式:
Expression.Condition(Expression.Constant(true),
Expression.Default(typeof(int?)),
Expression.Constant(1, typeof(int?)))
或者輸入條件表達式:
Expression.Condition(Expression.Constant(true),
Expression.Default(typeof(int?)),
Expression.Constant(1),
typeof(int?))
第一個改變常量是如何工作的(在兩種情況下,值都存儲為盒裝int
,就像int
常量一樣,而unboxing,如果需要,則是int?
。
第二個使條件本身存儲兩個必須轉換為操作數的類型。
請注意,可能沒有任何實際的轉換,尤其是前兩個,例如,如果您編譯,您可能編譯為一個作用於int?
的表單int?
直接,所以雖然表達式對象需要一個強制轉換來處理,但它生成的編譯代碼卻沒有。
另請注意,某些提供程序無法處理鍵入的條件,使最後一個選項不可用。例如, EnumerableQuery
無法處理它們(請參閱https://github.com/dotnet/corefx/issues/3607 )。