Вопрос

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

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, но преобразование его в логическое значение не кажется логичным.Неявный оператор позволяет вам проверить, является ли ссылка точки сохранения нулевой или нет, просто оценив ссылку:

if (point) {

вместо:

if (point != null) {

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

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

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

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

(раздел 10.10.3)

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

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

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

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

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

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;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top