Я только что видел, что он использовался в одном из недавних ответов:
public static implicit operator bool(Savepoint sp)
{
return sp != null;
}
Зачем нам здесь нужно слово implicit и что оно означает?
Я только что видел, что он использовался в одном из недавних ответов:
public static implicit operator bool(Savepoint sp)
{
return sp != null;
}
Зачем нам здесь нужно слово implicit и что оно означает?
Неявное означает, что преобразование не требует приведения в вашем коде.
Теперь вы можете сделать это:
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#.
Просто чтобы добавить к ответу mquander.
Из спецификации языка С# 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;
в противном случае я рекомендую вам определить явный оператор!