我在構建表達式時遇到了一個有趣的問題。我進行了一些基本的類型強制檢查以確保完成最少的強制轉換,但是,我遇到了一個我沒想到的問題。當我嘗試生成BinaryExpressionusingExpression.Assign并且我將從decimal到decimal?我收到異常:System.ArgumentException: 'System.Decimal' 類型的表達式不能用于分配給類型 'System.Nullable'1[System.Decimal]有人可以解釋一下嗎?考慮到以下評估為真:typeof(decimal?).IsAssignableFrom(typeof(decimal))預期的分配應等于以下語句:decimal? x = null;decimal y = 10;x = y;有問題的代碼:private Expression BuildMapExpressionForValueMap(MemberInfo destinationProperty, MemberInfo sourceProperty){ Expression assignmentExpression = Expression.PropertyOrField(_source, sourceProperty.Name); Type destinationType = destinationProperty.GetUnderlyingType(); if (!destinationType.IsAssignableFrom(sourceProperty.GetUnderlyingType())) { assignmentExpression = BuildCastExpression(assignmentExpression, destinationType); } var expression = Expression.Assign(Expression.PropertyOrField(_destination, destinationProperty.Name) , assignmentExpression); return expression;}
2 回答

冉冉說
TA貢獻1877條經驗 獲得超1個贊
存在從不可為空值類型到相應的可為空值類型的隱式轉換。您生成的表達式必須是顯式的。無法生成將 Int32 分配給 Int64 類型變量的表達式的相同原因。編譯器顯式生成轉換調用,因此您不必這樣做。試試看,你會看到。
您必須添加轉換。
var param = Expression.Variable(typeof(decimal?));
var value = Expression.Constant(20m, typeof(decimal));
var expr = Expression.Assign(param,
//value // fails
Expression.Convert(value, param.Type)
);
- 2 回答
- 0 關注
- 187 瀏覽
添加回答
舉報
0/150
提交
取消