我在IronPython中编写DSL。在C#中重载运算符并使用
它们在python中运行正常,直到你进入赋值(=
)运算符。
使用隐式转换重载解决了C#端的问题,但它在python中不起作用。
这是重现错误的最小示例:
class FloatValue
{
public FloatValue(float value)
{
this.value = value;
}
public static implicit operator FloatValue(float value)
{
return new FloatValue(value);
}
public float value;
}
然后我执行:
FloatValue value = 5.0f // It works!!!
但在Python中:
# value is already an instance of FloatValue, it comes from somewhere. It's considered
# an immutable value, so there is no problem with generating a new instance.
value = 5.0 # Assigns the value, but does not work :(
我得到以下异常:
预期的FloatValue,浮动
我怎样才能让它发挥作用?
答案 0 :(得分:1)
Python不支持单精度浮点值。因此,文字 5.0 (在IronPython的情况下)表示为System.Double。
您可以将DSL更改为使用双精度,也可以通过添加
隐式转换为floatpublic static implicit operator FloatValue(double value)
{
return new FloatValue(Convert.ToSingle(value));
}