Как я могу безопасно бросить систему.Возражаете против 'bool' в C#?
я извлекаю bool значение из коллекции (не универсальной, гетерогенной).
The 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 если по какой-либо причине значение не является логическим?
7 ответов:
есть два варианта... с немного удивительной производительностью:
избыточные проверки:
if (rawValue is bool) { bool x = (bool) rawValue; ... }используя тип с нулевым значением:
bool? x = rawValue as bool?; if (x != null) { ... // use x.Value }удивительная часть заключается в том, что производительность второй формы намного хуже, чем первая.
в C# 7, Вы можете использовать сопоставление с образцом для этого:
if (rawValue is bool value) { // Use value here }обратите внимание, что вы в конечном итоге с
valueв рамках (но не обязательно назначенный) послеifзаявление.
такой:
if (rawValue is bool) { bool value = (bool)rawValue; //Do something } else { //It's not a bool }В отличие от ссылочных типов, нет быстрого способа попытаться привести к типу значения без двух приведений. (Или блок catch, что было бы хуже)
вы не определили, что вы хотите, чтобы произошло, если rawValue не конвертируется в bool. Общие варианты-вернуть false, null или создать исключение. Существует также возможность преобразования строкового представления rawValue в bool, например Yes/No, True/False, 1/0 и т. д.
Я бы использовал bool.Попробуйте сделать преобразование. Это будет успешно, если rawValue является bool или его строковое значение "True"или " False".
bool result; if (!bool.TryParse(rawValue as string, out result)) { // you need to decide what to do in this case }
при условии, что вам на самом деле не нужно держать ссылку на
rawValue, вот один-лайнер с помощьюGetValueOrDefault()методNullable<T>структура:bool value = (map.GetValue(key) as bool?).GetValueOrDefault();вы также можете указать значение по умолчанию с помощью метода перегрузки
GetValueOrDefault(T).
Comments