2009-03-01 5 views
16

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

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

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

ответ

28

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

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

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 
+0

У вас есть слова, замешанные в явном цикле чисел. «преобразование меньших типов в более крупные типы» должно быть наоборот. – Samuel

+0

Спасибо. Я исправил свою ошибку. – mquander

+0

Поплавок меньше, чем двойной, не так ли? – configurator

2

Просто добавьте ответ mquander.

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

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

(раздел 10.10.3)

0

Вы должны указать 'неявное', так и есть явные операторы.

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

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; 

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

7

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

if (point) { 

вместо:

if (point != null) { 

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

+0

Это абсолютно правильно. – mquander

1

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

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

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