У вас есть несколько вариантов:
(int)
- Оператор броска. Работает, если объект уже является целым на некотором уровне в иерархии наследования или если определено неявное преобразование.
int.Parse()/int.TryParse()
- Для преобразования из строки неизвестного формата.
int.ParseExact()/int.TryParseExact()
- Для преобразования из строки в определенном формате
Convert.ToInt32()
- Для преобразования объекта неизвестного типа. Он будет использовать явное и неявное преобразование или реализацию IConvertible, если таковые определены.
as int?
- Обратите внимание "?". as
Оператор только для ссылочных типов, и поэтому я использовал «?» чтобы обозначить Nullable<int>
. Оператор " as
" работает, как Convert.To____()
, но думать, TryParse()
а не Parse()
: он возвращает, null
а не выдает исключение, если преобразование не удается.
Из них я бы предпочел, (int)
чтобы объект на самом деле представлял собой целое в штучной упаковке. В противном случае используйте Convert.ToInt32()
в этом случае.
Обратите внимание, что это очень общий ответ: я хочу обратить внимание на ответ Даррена Кларка, потому что я думаю, что он хорошо справляется со спецификой , но пришел поздно и еще не проголосовал. Во всяком случае, он получает мой голос за «принятый ответ», за рекомендацию (int), за указание на то, что в случае неудачи он (int)(short)
может работать, и за рекомендацию проверить ваш отладчик, чтобы узнать фактический тип времени выполнения.
Актерский состав
(int) myobject
должен просто работать.Если это дает вам недопустимое исключение приведения, то это, вероятно, потому, что тип варианта не VT_I4. Бьюсь об заклад, что вариант с VT_I4 конвертируется в упакованный int, VT_I2 в упакованный короткий и т. Д.
При приведении типа в штучной упаковке допустимо только приведение к типу в штучной упаковке. Например, если возвращаемый вариант - VT_I2, он
(int) (short) myObject
должен работать.Самый простой способ выяснить это - проверить возвращаемый объект и взглянуть на его тип в отладчике. Также убедитесь, что в сборке взаимодействия у вас есть возвращаемое значение, помеченное как
MarshalAs(UnmanagedType.Struct)
источник
Convert.ToInt32 (MyObject);
это будет обрабатывать случай, когда myobject имеет значение null и возвращает 0, вместо того, чтобы выдавать исключение.
источник
ToInt32
.Используйте
Int32.TryParse
следующим образом.источник
Я перечисляю разницу в каждом из способов кастинга. Что за конкретный тип литья ручки и нет?
источник
Может быть, Convert.ToInt32 .
Остерегайтесь исключений в обоих случаях.
источник
источник
Convert.ChangeType
. Я бы сказал, что не может быть идеальным ответом для ОП, но это определенно полезно для некоторых!Также есть TryParse .
Из MSDN:
источник
Странно, но принятый ответ кажется неверным в отношении приведения и преобразования в том смысле, что из моих тестов и чтения документации тоже не следует принимать во внимание неявные или явные операторы.
Итак, если у меня есть переменная типа object, а у «коробочного» класса есть определенные неявные операторы, они не будут работать.
Вместо этого еще один простой способ, но на самом деле снижение производительности - это приведение в динамическом режиме.
(INT) (динамическая) MyObject.
Вы можете попробовать это в Интерактивном окне VS.
источник
dynamic
далеко не бесплатноисточник