Подтвердить что ты не робот

Неявный оператор

Я только видел, что он использовал в одном из последних ответов:

public static implicit operator bool(Savepoint sp)
{
    return sp != null;
}

Зачем нам здесь подразумеваться слово, и что это значит?

4b9b3361

Ответ 1

Неявный означает, что преобразование не требует наличия в вашем коде.

Теперь вы можете сделать это:

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

Ответ 2

Это похоже на неправильное использование неявного оператора. Я не знаю, что делает класс Savepoint, но преобразование его в логическое не кажется логичным. Неявный оператор позволяет проверить, является ли ссылка Savepoint нулевой или нет, просто оценивая ссылку:

if (point) {

вместо:

if (point != null) {

Если он используется таким образом, это скрывает то, что на самом деле делает код, и это противоречит почти всему, что есть в С#.

Ответ 3

Просто добавьте ответ mquander.

Из спецификации языка С# 3.0:

Объявление оператора преобразования, включает ключевое слово implicitвводит определяемые пользователем неявные преобразование. Неявные преобразования могут происходят в самых разных ситуациях, включая вызовы функций, литые выражения и назначения.

(раздел 10.10.3)

Ответ 4

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

Вы используете неявный оператор преобразования, когда уверены, что преобразование не потеряет никаких данных. Например, с расширяющимися принуждениями (int → long, float → double). Явные операторы преобразования используются, когда какое-либо состояние будет потеряно, или вы не хотите, чтобы компилятор автоматически зависал код клиента, вставляя конверсии по всему месту.

Преобразование, подобное вашему, действительно приведет к хаосу, потому что нецелесообразно выполнять это конкретное преобразование.

Ответ 5

Вам нужно указать '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;

В противном случае я рекомендую вам определить явный оператор!