为了账号安全,请及时绑定邮箱和手机立即绑定

生成 Expression.Assign 以设置小数时出现异常?从十进制

生成 Expression.Assign 以设置小数时出现异常?从十进制

C#
米琪卡哇伊 2021-08-22 14:54:05
我在构建表达式时遇到了一个有趣的问题。我进行了一些基本的类型强制检查以确保完成最少的强制转换,但是,我遇到了一个我没想到的问题。当我尝试生成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)

);


查看完整回答
反对 回复 2021-08-22
  • 2 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信