Неявный оператор IronPython C # не работает в Python - PullRequest
2 голосов
/ 22 марта 2012

Я пишу DSL в IronPython.Перегрузка операторов в 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, есть число с плавающей запятой

Как я могу заставить его работать?

1 Ответ

1 голос
/ 25 марта 2012

Python не поддерживает значения с плавающей запятой одинарной точности. Поэтому литерал 5.0 (в случае IronPython) представляется как System.Double .

Вы можете либо изменить DSL, чтобы использовать двойную точность, либо просто неявно преобразовать его в число с плавающей точкой, добавив

public static implicit operator FloatValue(double value)
{
    return new FloatValue(Convert.ToSingle(value));
}
...