Я только видел, что он использовал в одном из последних ответов:
public static implicit operator bool(Savepoint sp)
{
return sp != null;
}
Зачем нам здесь подразумеваться слово, и что это значит?
Я только видел, что он использовал в одном из последних ответов:
public static implicit operator bool(Savepoint sp)
{
return sp != null;
}
Зачем нам здесь подразумеваться слово, и что это значит?
Неявный означает, что преобразование не требует наличия в вашем коде.
Теперь вы можете сделать это:
Savepoint point = new Savepoint();
if(point) // becomes a bool using your operator
{
}
вместо этого:
Savepoint point = new Savepoint();
if((bool)point) // an "explicit" conversion
{
}
Одним из примеров того, почему это полезное различие, являются числовые типы. Там подразумевается переход от "меньших" типов к "более крупным" типам, например:
float f = 6.5;
double d = f; // implicit conversion
Но преобразование больших типов в более мелкие типы может быть опасным, поэтому существует только явное преобразование, заставляющее пользователя прояснить, что он действительно намерен выполнить эту операцию:
long l = 20;
// short s = l;
short s = (short)l; // explicit conversion
Это похоже на неправильное использование неявного оператора. Я не знаю, что делает класс Savepoint, но преобразование его в логическое не кажется логичным. Неявный оператор позволяет проверить, является ли ссылка Savepoint нулевой или нет, просто оценивая ссылку:
if (point) {
вместо:
if (point != null) {
Если он используется таким образом, это скрывает то, что на самом деле делает код, и это противоречит почти всему, что есть в С#.
Просто добавьте ответ mquander.
Из спецификации языка С# 3.0:
Объявление оператора преобразования, включает ключевое слово
implicit
вводит определяемые пользователем неявные преобразование. Неявные преобразования могут происходят в самых разных ситуациях, включая вызовы функций, литые выражения и назначения.
(раздел 10.10.3)
Операторы преобразования преобразуются из одного типа в другой. Неявное означает, что вам не нужно вводить явное выражение в коде для преобразования, явное требует, чтобы приведение в код вызывалось.
Вы используете неявный оператор преобразования, когда уверены, что преобразование не потеряет никаких данных. Например, с расширяющимися принуждениями (int → long, float → double). Явные операторы преобразования используются, когда какое-либо состояние будет потеряно, или вы не хотите, чтобы компилятор автоматически зависал код клиента, вставляя конверсии по всему месту.
Преобразование, подобное вашему, действительно приведет к хаосу, потому что нецелесообразно выполнять это конкретное преобразование.
Вам нужно указать 'implicit', потому что также есть явные операторы.
Это означает, что преобразование между булевым и Savepoint может выполняться неявно, например. = скрытый.
Savepoint s = new Savepoint();
bool b = s;
Явное преобразование, например. очевидно, можно сделать следующим образом:
Savepoint s = new Savepoint();
bool b = (bool)s;
Неявное преобразование часто используется, когда нет возможной потери данных, т.е. от Int16 (short)
до Int32 (int)
. Но если это возможно, вам нужно "согласиться" с ним, используя явное преобразование.
В вашем случае, например, если Savepoint
- это просто
struct Savepoint
{
public bool data;
}
вы можете использовать неявное преобразование, потому что потеря данных невозможна:
Savepoint s = new Savepoint();
s.data = true;
bool b = s;
В противном случае я рекомендую вам определить явный оператор!