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

我在构建表达式时遇到了一个有趣的问题。我进行了一些基本的类型强制检查以确保完成最少的强制转换,但是,我遇到了一个我没想到的问题。


当我尝试生成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;

}


米琪卡哇伊
浏览 162回答 2
2回答

冉冉说

存在从不可为空值类型到相应的可为空值类型的隐式转换。您生成的表达式必须是显式的。无法生成将 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));
打开App,查看更多内容
随时随地看视频慕课网APP