Я заимствовал код ниже из другого вопроса (слегка измененный) для использования в моем коде:
internal class PositiveDouble
{
private double _value;
public PositiveDouble(double val)
{
if (val < 0)
throw new ArgumentOutOfRangeException("Value needs to be positive");
_value = val;
}
// This conversion is safe, we can make it implicit
public static implicit operator double(PositiveDouble d)
{
return d._value;
}
// This conversion is not always safe, so we're supposed to make it explicit
public static explicit operator PositiveDouble(double d)
{
return new PositiveDouble(d); // this constructor might throw exception
}
}
Оригинальный автор этого кода правильно придерживается предупреждений, приведенных в MSDN неявный и явная документация, но здесь мой вопрос: Является ли explicit
всегда необходимым в потенциально исключительном коде?
Итак, у меня есть некоторые типы в моем коде (например, "Том" ), которые происходят из PositiveDouble, и я хотел бы иметь возможность устанавливать экземпляры, как в первой строке ниже:
Volume v = 10; //only allowed by implicit conversion
Volume v = new Volume(10) //required by explicit conversion, but gets messy quick
Будучи вынужденным использовать явные приведения, код становится намного менее читаемым. Как он защищает пользователя? В семантике моей программы я никогда не ожидаю, что объем будет отрицательным; действительно, если это произойдет, я ожидаю, что будет выбрано исключение. Итак, если я использую неявное преобразование, и он бросает, какие "неожиданные результаты" могут сжать меня?