2012-02-13 5 views
0

У меня есть образец кусок коды со мной:Использование '?' во время литья

bool _HasParsed; 
object IsCheckedAsObj = GetCheckedStatus(); 
if (IsCheckedAsObj == null) 
{ 
    throw new InvalidOperationException("Status not found"); 
} 
_HasParsed = (bool?)IsCheckedAsObj; //why (bool?) instead of (bool) 

В последней строке, я могу понять, что они разбор объекта Boolean. Но что это такое? делать там? Какая разница между (bool?) Вместо (bool)?

+1

Содержит ли этот образец кода кода? Я не думал, что вы можете присвоить 'Nullable ' '' bool'. – Lukazoid

+0

Это не (просто протестировано). – hcb

+0

yep .... это не ... но я получил информацию для использования значений Nullable. Спасибо – Sandy

ответ

5

Тип bool? является сокращением на Nullable<bool>.

Код не компилируется в его нынешнем виде. Появится сообщение об ошибке «Невозможно неявно преобразовать тип« bool »? на "bool". ".

Если вы объявляете переменную как обнуляемые тоже будет работать:

bool? _HasParsed; 

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

+0

, так какой будет результат, если кастинг не удался? – Sandy

+0

@rapsalands Я считаю, что если 'IsCheckedAsObj' является либо' null', либо 'bool', либо' Nullable '(' bool? '), Он будет работать. Если 'IsCheckAsObj' не является ничем из них, то кастинг завершится неудачно, и возникнет исключение. Если это нежелательно, попробуйте '_HasParsed = IsCheckedAsObj как bool?;' – Lukazoid

+0

@rapsalands: Если сбой кастинга, вы получите исключение 'InvalidCastException' во время выполнения. – Guffa

1

Разница между bool и bool? является то, что bool? является Nullable<bool>, что означает, что BOOL имеет три возможных значения: false, true и null (= не задано).

bool? nullableBool = null; 

if (b.HasValue) 
{ 
    bool notNullableBool = b.Value; 
} 

Here - это документация MSDN.

+0

За исключением того, что вам нужно вызвать '.Value', чтобы получить фактическое значение' bool'. Я уверен, что вы это знали, но это не было выражено в ответе. – Davy8

+0

Thnx. Я добавил его к моему ответу. –

1

Виды с ?, такие как bool? являются nullable. Узнайте, как use them.
Он также может быть представлен как Nullable<bool>. И может применяться только для типов struct.
Функция нулевого типа состоит в том, что вы можете присвоить их значение или null.

Использование:

int? number; 
// do something with number 
if (number.HasValue) 
{ 
    Console.WriteLine(number.Value); 
} 
else 
{ 
    Console.WriteLine("No value"); 
} 

или

Console.WriteLine(number.HasValue ? number.Value : "No value"); 
0

В ? это сокращение для структуры ниже:

struct Nullable<T> 
{ 
    public bool HasValue; 
    public T Value; 
} 

Вы можете использовать эту структуру непосредственно, но? это синтаксис ярлыка, чтобы сделать полученный код намного чище. Вместо ввода: Nullable x = new Nullable (125);

Вместо этого вы можете написать: int? x = 125;

Это не работает со строкой, так как строка является ссылочным типом, а не типом значения.

4

bool? является сокращением на Nullable<bool>. Ваш код ему не нужен, потому что перед назначением есть проверка от null.

Отредактировано: Как Je Ли Хуань правильно указана в комментариях, проверка на null означает, что возвращаемое значение GetCheckedStatus() имеет типа bool?. Следующие упрощенные снимки будут делать то же самое, что и исходный код в вопросе OP:

object IsCheckedAsObj = GetCheckedStatus(); 
if (IsCheckedAsObj == null) 
    throw new InvalidOperationException("Status not found"); 
bool _HasParsed = (bool)IsCheckedAsObj; 
+0

Интересно, не знал, что вы можете напрямую наложить 'bool?' На 'bool'. Думал, что вам пришлось использовать '.Value' (явно не удается, если он равен нулю во время выполнения, но я думал, что это будет ошибка компиляции). Я просто проверил его, но он работает. – Davy8

+0

Ваша отредактированная версия неверна. Если GetCheckedStatus() возвращает bool, if (IsCheckedAsObj == null) всегда будет false. Поэтому мы должны предположить, что он возвращает bool ?. Тот же код работает и не нуждается в вызовах HasValue или Value –

+0

@JeowLiHuan да, спасибо за подсказку. –

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