Как я безопасно бросаю Систему. Объект к 'bool' в C#?

Я извлекаю a bool значение от (неуниверсальный, неоднородный) набор.

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

// This does not work: "The as operator must be used with a reference type ('bool' is a value type)"
object rawValue = map.GetValue(key);
bool value = rawValue as bool;

Есть ли что-то подобное, которое может быть сделано для безопасного кастинга объекта к типу значения без возможности InvalidCastException если по любой причине значение не является булевской переменной?

67
задан Daniel Fortunov 28 June 2018 в 06:34
поделиться

5 ответов

Есть два варианта... с немного удивительной производительностью:

  • Проверка на избыточность:

    если (rawValue - шерсть)
    {
     шерсть х = (шерсть) сырая стоимость;
     ...
    }
    
  • Использование нулевого типа:

    bool? x = rawValue как bool?..;
    если (x != null)
    {
     ... // используйте x.Value
    }
    

Удивительно, что исполнение второй формы намного хуже, чем первой .

В C# 7 для этого можно использовать сравнение по образцу:

if (rawValue is bool value)
{
    // Use value here
}

Обратите внимание, что после утверждения if

вы все равно получаете значение в области действия (но не определенно назначенное).

.
117
ответ дан 24 November 2019 в 14:34
поделиться

Вот так:

if (rawValue is bool) {
    bool value = (bool)rawValue;
    //Do something
} else {
    //It's not a bool
}

В отличие от ссылочных типов, нет быстрого способа попытаться привести к типу значения без двух каст. (Или блок подхвата, что было бы хуже)

16
ответ дан 24 November 2019 в 14:34
поделиться
bool value;
if(rawValue is bool)
  value = (bool)rawValue;
else {
  // something is not right...
7
ответ дан 24 November 2019 в 14:34
поделиться

Вы не определили, что должно произойти, если rawValue не конвертируется в bool. Обычный выбор - вернуть false, null или бросить исключение. Также существует возможность строкового представления rawValue для конвертирования в bool, например, Yes/No, True/False, 1/0 и т.д.

Я бы использовал bool.TryParse для выполнения преобразования. Это будет успешно, если rawValue является bool или его строковое значение "True" или "False".

bool result;
if (!bool.TryParse(rawValue as string, out result))
{
    // you need to decide what to do in this case
}
4
ответ дан 24 November 2019 в 14:34
поделиться

Вы можете бросить его в шерсть? с ключевым словом в качестве и проверить свойство HasValue .

.
4
ответ дан 24 November 2019 в 14:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: