2012-03-21 2 views
2

IronPython에서 DSL을 작성했습니다. C#에서 연산자를 오버로딩하고 을 파이썬으로 사용하면 할당 (=) 연산자를 사용할 때까지 정상적으로 작동합니다.IronPython C# 암시 적 연산자가 파이썬에서 작동하지 않습니다.

암시 적 캐스트 오버로드를 사용하면 C# 측에서 문제가 해결되지만 파이썬에서는 작동하지 않습니다.

이 오류 재현 최소한의 예입니다 : 다음

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!!! 

하지만 파이썬 :

# 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 :(

나는 다음과 같은 예외가 :

Expected FloatValue, got float

어떻게 작동합니까?

답변

1

파이썬은 단 정밀도 부동 소수점 값을 지원하지 않습니다. 따라서 글자 5.0System.Double으로 표시됩니다 (IronPython의 경우).

당신은 배정 밀도를 사용하도록 DSL을 변경하거나 암시

public static implicit operator FloatValue(double value) 
{ 
    return new FloatValue(Convert.ToSingle(value)); 
} 
을 추가하여 부동 아래로 변환 할 수 있습니다