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

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

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

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


person Community    schedule 01.03.2009    source источник


Ответы (5)


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

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

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
person mqp    schedule 01.03.2009
comment
Вы перепутали слова в явном приведении цифр. преобразование меньших типов в более крупные должно происходить наоборот. - person Samuel; 01.03.2009
comment
float меньше, чем double, не так ли? - person configurator; 01.03.2009

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

if (point) {

вместо:

if (point != null) {

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

person Guffa    schedule 01.03.2009

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

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

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

(раздел 10.10.3)

person Brian Rasmussen    schedule 01.03.2009

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

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

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

person Tanveer Badar    schedule 01.03.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;

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

person abatishchev    schedule 01.03.2009