Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 141
В переменной типа Object value могут хранится разные типы. Я проверяю другое свойство и соответственно трактую значение в нужный тип. Что то не могу понять по ошибке

var temp1 = value == null ? (long?)null : (long)value;

... дальше переходим в ветку работы с параметров исходя из типа long


System.InvalidCastException: 'Unable to cast object of type 'System.Int32' to type 'System.Int64'.'

Причем в объекте вообще хранится 1.

Какого ? С какой стати нельзя привести тип меньшего размера к большему ?
4 июн 19, 16:05    [21901661]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
Konst_One
Member

Откуда:
Сообщений: 11227
            long? v = (long?)value;
            var temp1 = (v.HasValue) ? v.Value: null;
4 июн 19, 16:10    [21901663]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 141
Спасибо.
Нашел решение подобной проблемы через класс Convert.ToInt64. Сейчас все ок.

Просто ошибка очень странная :) Типа я не могу положить ваш спичечный коробок в грузовик, извините.
4 июн 19, 16:22    [21901675]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
Konst_One
Member

Откуда:
Сообщений: 11227
просто присвоить, преобразование выше даёт ошибку
            //Int64? val = null; //1;
            Int32 val = 1;
            long? vv = val;
            var temp1 = vv;
            Console.WriteLine(vv);
4 июн 19, 16:22    [21901676]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 141
Но вот почему выдает ошибку то ? Вот что странно ! Тут даже unchecked не нужен, какие тут вообще могут быть проблемы, что фреймворк ругается.
Причем я бы еще понял, если бы как раз ошибка была при присваивании, но я то явно приведение делаю.
4 июн 19, 16:30    [21901684]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2661
WaspNewCore
Но вот почему выдает ошибку то ? Вот что странно ! Тут даже unchecked не нужен, какие тут вообще могут быть проблемы, что фреймворк ругается.
Причем я бы еще понял, если бы как раз ошибка была при присваивании, но я то явно приведение делаю.


проверил тот же код у себя - ошибки нет, преобразовывает
4 июн 19, 17:32    [21901750]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2661
Ролг Хупин
WaspNewCore
Но вот почему выдает ошибку то ? Вот что странно ! Тут даже unchecked не нужен, какие тут вообще могут быть проблемы, что фреймворк ругается.
Причем я бы еще понял, если бы как раз ошибка была при присваивании, но я то явно приведение делаю.


проверил тот же код у себя - ошибки нет, преобразовывает


Ошибся, та же ошибка на коде

Object val = 1;
var temp1 = val == null ? (long?)null : (long)val;
4 июн 19, 17:34    [21901752]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72736
WaspNewCore
Но вот почему выдает ошибку то ?
потому что long? и long это разные типы. компилятор не может определиться, какой тип должен быть у temp1.
4 июн 19, 19:28    [21901872]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4389
Antonariy, разве? Была бы ошибка компиляции...
4 июн 19, 20:43    [21901919]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
hVostt
Member

Откуда:
Сообщений: 15381
Ролг Хупин
Object val = 1;


присваиваем val значение 1 типа Int32 (по умолчанию целые числа все int)
теперь val хранит ссылку на объект в куче типа Int32


Ролг Хупин
var temp1 = val == null ? (long?)null : (long)val;


пытаемся привести ссылку на объект в куче к типу Int64.
не преобразовать, а привести к типу.

это неправильно. сначала надо привести к правильному типу, потом преобразовывать.
4 июн 19, 21:20    [21901941]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20320
Antonariy,

нет, nullable тут вообще не причем
			object val = 5;
			long vall = (long)val;
этот код выдает ту же ошибку.
Implicit-преобразование тут не канает, потому что нет implicit для object=>long
4 июн 19, 21:22    [21901943]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20320
Shocker.Pro
Antonariy,

нет, nullable тут вообще не причем
			object val = 5;
			long vall = (long)val;

этот код выдает ту же ошибку.
Implicit-преобразование тут не канает, потому что нет implicit для object=>long
а вот так всё будет ок - сначала распаковываем, потом преобразовываем
			object val = 5;
			long vall = (long)(int)val;
4 июн 19, 21:23    [21901946]     Ответить | Цитировать Сообщить модератору
 Re: Unable to cast object of type 'System.Int32' to type 'System.Int64'. Что за ерунда ?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4801
При приведении ссылочного типа к значимому будет анбоксинг с одновременным приведением типа и без конвертации, как уже писали выше. В IL-коде в этом месте будет инструкция unbox.any [mscorlib]System.Int64.
Jeffrey Richter, CLR via C#, Chapter 5
Internally, here’s exactly what happens when a boxed value type instance is unboxed:
1. If the variable containing the reference to the boxed value type instance is null, a NullReferenceException is thrown.
2. If the reference doesn’t refer to an object that is a boxed instance of the desired value type, an InvalidCastException is thrown.
The second item above means that the following code will not work as you might expect:

public static void Main() {
  Int32 x = 5;
  Object o = x; // Box x; o refers to the boxed object
  Int16 y = (Int16) o; // Throws an InvalidCastException
}
Logically, it makes sense to take the boxed Int32 that o refers to and cast it to an Int16. However, when unboxing an object, the cast must be to the exact unboxed value type—Int32 in this case.
5 июн 19, 06:24    [21902059]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить