2012-04-30 2 views
6

Код ниже терпит неудачу на последнем назначении:C# int- или объекта к двойной литья ошибки объяснения

static void Main(string[] args) 
{ 
    int a = 5; 
    object b = 5; 

    System.Diagnostics.Debug.Assert(a is int && b is int); 

    double x = (double)a; 
    double y = (double)b; 
} 

Если одновременно и Ь int, что является причиной этой ошибки?

+0

Возможный дубликат [Литье в коробке] (http://stackoverflow.com/questions/5312731/casting-a-boxed-value) – Brian

ответ

15

распаковка требует точного типа - вы можете сделать это вместо:

double y = (double)(int)b; 
+0

Интересно. Благодаря! – digdig

20

Это очень часто задаваемый вопрос. См. http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx для пояснения.


Отрывок:

Я получаю немало вопросов относительно оператора C# литым. Наиболее частым вопросом, который я получаю, является:

short sss = 123; 
object ooo = sss;   // Box the short. 
int iii = (int) sss;   // Perfectly legal. 
int jjj = (int) (short) ooo; // Perfectly legal 
int kkk = (int) ooo;   // Invalid cast exception?! Why? 

Почему? Потому что в коробке T можно только распаковать до T. (*) После того, как он будет распакован, это просто значение, которое можно отличить, как обычно, так что двойное нажатие отлично работает.

(*) or Nullable<T>.

0

a является int, но b является ссылкой на объект, который является int - это то, что называется боксировал внутр. Это две разные вещи, отсюда и другое поведение.

1

Неявное литье - это операция времени компиляции. Это невозможно для b типа object.

Смежные вопросы