Некоторые из существующих ответов не вполне права. Вы не можете использовать non-nullable с as
, потому что результат as
является нулевым значением типа, если первый операнд фактически не соответствует соответствующему типу.
Тем не менее, вы можете использовать as
со значениями типов ...если они обнуляемые:
int a = 10;
object o = a;
int? x = o as int?; // x is a Nullable<int> with value 10
long? y = o as long?; // y is a Nullable<long> with the null value
Таким образом, вы мог использование:
Call? call = line.Tag as Call?;
Затем вы можете использовать его как:
if (call != null)
{
// Do stuff with call.Value
}
Два предостережений, хотя:
- По моему опыту это медленнее, чем только с помощью
is
с последующим броском
- Вы должны серьезно пересмотреть свой текущий
Call
типа:
- Это разоблачение открытых полей, которые, как правило, бедная инкапсуляция
- Это тип изменчивого значения, которое почти наверняка ошибка
Я бы настоятельно рекомендуем вам сделать это класс вместо этого - в какой момент эта проблема уходит в любом случае.
Еще одна мысль: если тег должен всегда быть Call
, то лучше бросить его:
Call call = (Call) line.Tag;
Таким образом, если данные не соответствуют вашим ожиданиям (т.е. есть какая-то ошибка, такие что Tag
не является Call
), то вы можете узнать об этом раньше, а не после того, как вы потенциально сделали какую-то другую работу. Обратите внимание, что этот приведение будет вести себя по-разному в зависимости от того, является ли Call
структурой или классом, если Tag
имеет значение NULL - вы можете присвоить значение null переменной переменной ссылочного типа (или типу значения NULL) тип значения NULL.
Почему вы создали такую структуру? Смещаемые структуры - плохая идея. – 2010-12-09 17:50:48
@Mark: +1 И структура просто собирается получить коробку для хранения в свойстве Tag в любом случае ... – cdhowie 2010-12-09 17:59:32
Хм, это не обязательно быть изменчивым. Но я думаю, что я должен улучшить класс для этой цели. – 2010-12-09 18:30:44