2009-12-18 6 views
2

У меня есть следующие:- это явное приведение, когда я знаю, что это не нуль?

MyEnum? maybeValue = GetValueOrNull(); 

if (null != maybeValue) 
{ 
    MyEnum value = (MyEnum)maybeValue; 
} 

То, что я хочу знать, если это явно (MyEnum) бросок необходимо на экземпляре типа MyEnum?. Это похоже на простой вопрос, я просто чувствовал себя параноидальным, что может быть какая-то ошибка во время выполнения, если я только что сделал MyEnum value = maybeValue в этом заявлении if.

ответ

4

В ряде ответов было отмечено, что использование свойства Value позволяет избежать отливки. Это правильно и отвечает на вопрос:

является то, что явное (MyEnum) отливать необходимо на примере типа «MyEnum?» ?

Однако мы не обратились в другую озабоченность:

Я просто чувствовал, параноидальный, что могло бы быть какая-то ошибка времени выполнения, если я только что сделал значение MyEnum = maybeValue в том, что если заявление.

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

Однако, если вы это сделаете так, как вы описали - сначала проверьте, есть ли значение, то это безопасно. (Конечно, никто не мутирует переменную, содержащую значение NULL между вызовом HasValue и выборкой значения.)

Если вы используете ILDASM или какой-либо другой инструмент для проверки сгенерированного кода, вы обнаружите, что литье значение nullable для его базового типа просто создается как доступ к свойству Value; использование оператора трансляции или доступ к свойству Value - это разница, которая фактически не имеет никакого значения. Атрибут свойства Value будет выдавать, если HasValue является ложным.

Используйте любой синтаксис, который вы чувствуете, выглядит лучше.Я лично, вероятно, выберу синтаксис «Значение» над синтаксисом броска, потому что, по-моему, он лучше читает «если он имеет значение, дайте значение», чем «если он имеет значение, преобразует его в свой базовый тип».

+0

Благодарим за описание различий (или отсутствия такового) между проверкой нулевой и отличной отбрасывания по сравнению с использованием 'HasValue' /' Value'. –

8

Для обнуляемого типа, вы можете сделать

if (maybeValue.HasValue) 
{ 
    MyEnum value = maybeValue.Value; 
} 
+0

отличные мысли думают одинаково. –

3

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

Вы можете переписать код, как этот

MyEnum? maybeValue = GetValueOrNull(); 

if (maybeValue.HasValue == true) 
{ 
    MyEnum value = maybeValue.Value; 
} 
6

Поскольку вы используете NULLABLE типы, попробуйте использовать

if(maybeValue.HasValue) 
{ 
    MyEnum value = maybeValue.Value; // no cast needed! Yay! 
} 
+0

+1 голос за то, что вы читатель разума. –

3

Другим вариантом было бы настроить перечисление иметь по умолчанию (0), а затем вы могли бы просто сделать следующее:

MyEnum value = GetValueOrNull().GetValueOrDefault(); 

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

+0

+1 для опрятного трюка, о котором я раньше не знал. Мне нужно будет проверить код на работе, чтобы узнать, можем ли мы воспользоваться этим. –

Смежные вопросы