Некоторые из существующих ответов не вполне правильно.Вы не можете использовать ненулевые типы с 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), но нек необнуляемому типу значения.