неявный оператор - PullRequest
19 голосов
/ 01 марта 2009

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

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

Зачем нам здесь слово неявное и что оно означает?

Ответы [ 5 ]

29 голосов
/ 01 марта 2009

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

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

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
9 голосов
/ 01 марта 2009

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

if (point) {

вместо:

if (point != null) {

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

2 голосов
/ 01 марта 2009

Просто чтобы добавить ответ Маквандера.

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

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

(раздел 10.10.3)

1 голос
/ 01 марта 2009

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

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

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

0 голосов
/ 01 марта 2009

Вам нужно указать 'неявный', потому что также есть явные операторы.

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

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;

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

...