Я извлекаю 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
если по любой причине значение не является булевской переменной?
Есть два варианта... с немного удивительной производительностью:
Проверка на избыточность:
если (rawValue - шерсть)
{
шерсть х = (шерсть) сырая стоимость;
...
}
Использование нулевого типа:
bool? x = rawValue как bool?..;
если (x != null)
{
... // используйте x.Value
}
Удивительно, что исполнение второй формы намного хуже, чем первой .
В C# 7 для этого можно использовать сравнение по образцу:
if (rawValue is bool value)
{
// Use value here
}
Обратите внимание, что после утверждения if
в области действия (но не определенно назначенное).. Вот так:
if (rawValue is bool) {
bool value = (bool)rawValue;
//Do something
} else {
//It's not a bool
}
В отличие от ссылочных типов, нет быстрого способа попытаться привести к типу значения без двух каст. (Или блок подхвата, что было бы хуже)
bool value;
if(rawValue is bool)
value = (bool)rawValue;
else {
// something is not right...
Вы не определили, что должно произойти, если 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
}
Вы можете бросить его в шерсть?
с ключевым словом в качестве
и проверить свойство HasValue
.