Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

249
Vistas
¿Por qué la matriz unboxing a un tipo incorrecto no genera una excepción en C#?

Hay una extraña inconsistencia con la conversión y desempaquetado de valores y matrices:

 var us = new uint[] { 1, 2, 3 }; var i1 = (int)us[0]; // direct value to value: works var i2 = (int)(object)us[0]; // unboxing value to value: compiles, throws at runtime var is1 = (int[])u; // direct array to array: does not compile var is2 = (int[])(object)u; // unboxing array to array: works! is2.GetType().Name // UInt32[]

¿Por qué se permite el desempaquetado de matrices cuando está prohibida una conversión directa?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

¿Por qué se permite el desempaquetado de matrices cuando está prohibida una conversión directa?

Si hace (int[])(object)us , está realizando dos conversiones, ambas permitidas por C# :

  • de uint[] a object (puede convertir cualquier tipo de referencia a object )
  • from object to int[] (puede convertir desde object a cualquier tipo de referencia)

Por lo tanto (int[])(object)us compila.

Si lo hace (int[])us , está realizando una sola conversión de int[] a uint[] , lo cual no está permitido en C#. De acuerdo con la especificación de C#, solo puede convertir de T[] a U[] si T y U son tipos de referencia, y puede convertir de T a U . int y uint no satisfacen ninguno de esos, por lo que (int[])us no compila.

En tiempo de ejecución, se comprueba la conversión de uint[] a int[] para ver si tiene éxito o falla. El CLR permite esto. Consulte la sección I.8.7.1 de la especificación CLR .

Una firma tipo T es compatible con una firma tipo U si y solo si se cumple al menos uno de los siguientes.

[...]

T es una matriz con el rango r y el tipo de elemento V, y U es una matriz con el mismo rango r y el tipo de elemento W, y V es una matriz-elemento-compatible-con W.

[...]

Un tipo de firma T es compatible con elementos de matriz con un tipo de firma U si y solo si T tiene un tipo subyacente V y U tiene un tipo subyacente W y cualquiera de los siguientes:

  1. V es compatible con W; o
  2. V y W tienen el mismo tipo reducido.

Y los "tipos reducidos" de int y uint son ambos int .

Esta es la razón por la cual (int[])(object)us tiene éxito en tiempo de ejecución.

También tenga en cuenta que us a object no es "boxear". Todo es un tipo de referencia aquí. Solo estás cambiando el tipo de la referencia.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda