我在构建表达式时遇到了一个有趣的问题。我进行了一些基本的类型强制检查以确保完成最少的强制转换,但是,我遇到了一个我没想到的问题。当我尝试生成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 关注
- 161 浏览
添加回答
举报
0/150
提交
取消