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

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

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

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

5 ответов


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

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

Savepoint point = new Savepoint();
if(point) // becomes a bool using your operator
{
}

вместо того чтобы сделать это:

Savepoint point = new Savepoint();
if((bool)point) // an "explicit" conversion
{
}

одним из примеров того, почему это полезное различие, являются числовые типы. Существует неявное преобразование из "меньших" типов в" большие " типы, например.g:

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) {

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


просто добавить к ответу mquander.

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

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

(п. 10.10.3)


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

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

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


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

это означает, что преобразование между Boolean и Savepoint может быть выполнено неявно, например = hidden.

Savepoint s = new Savepoint();
bool b = s;

явное преобразование, например очевидное, можно сделать следующим образом:

 Savepoint s = new Savepoint();
 bool b = (bool)s;

неявное преобразование часто используется, когда нет возможной потери данных, т. е. Int16 (short) до Int32 (int). Но если это возможно, вам нужно "согласиться" с ним, используя explicit преобразование.

в вашем случае, например, если Savepoint это просто

struct Savepoint
{
  public bool data;
}

вы можете использовать неявное преобразование, потому что потеря данных невозможна:

Savepoint s = new Savepoint();
s.data = true;
bool b = s;

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