c# - ¿Por qué dice Resharper que "la conversión de matriz covariante de la cadena[] al objeto[] puede causar una excepción en tiempo de ejecución en la operación de escritura" con este código?
string-conversion covariant-return-types (2)
El método comboBoxMonth.Items.AddRange
espera un parámetro object[]
. months.ToArray()
es la string[]
. Una conversión de la string[]
al object[]
es válida, pero si el método intenta modificar elementos de la matriz, obtendrá errores en tiempo de ejecución. En este caso no, por lo que puede ignorar la advertencia.
Si te molesta, puedes usar ToArray<object>()
comboBoxMonth.Items.AddRange(UsageRptConstsAndUtils.months.ToArray<object>());
Devolverá el object[]
y no se necesitará ningún lanzamiento.
Esta pregunta ya tiene una respuesta aquí:
- La conversión de matriz covariante de x a y puede causar respuestas de excepción 7 en tiempo de ejecución
Este código:
comboBoxMonth.Items.AddRange(UsageRptConstsAndUtils.months.ToArray());
public static List<String> months = new List<String>
{
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
};
Convierte R # en forma de escalón con la queja, "La conversión de matriz covariante de la cadena [] al objeto [] puede causar una excepción en tiempo de ejecución en la operación de escritura".
En realidad, este código funciona perfectamente: el cuadro combinado se llena con los valores del mes; ¿De qué trata Resharper y qué puedo hacer para mitigar sus dudas?
Si es simplemente que la lista genérica puede contener datos erróneos, no me preocuparé por eso, y si alguna vez hubiera un problema, sería bastante fácil rastrear el problema.
Un ejemplo para demostrar el problema:
void Main()
{
Animal[] animals = new Girafee[2];
animals[0] = new Zebra();
}
public class Animal { }
public class Girafee : Animal { }
public class Zebra : Animal { }
Esto lanzará una ArrayTypeMismatchException
en tiempo de ejecución.
Básicamente, R # le está sugiriendo un posible problema del hecho de que está asignando una string[]
a un object[]
, que está completamente permitido por el compilador, pero puede llevar a una excepción en tiempo de ejecución si un objeto, que comparte la misma clase base, se asigna a la matriz de la que ya apunta a un tipo diferente (como en mi ejemplo, en realidad apuntamos a una matriz de girafee). La covarianza de la matriz se rompe en el sentido de que no le proporciona la seguridad en tiempo de compilación que obtiene con los genéricos.
Eric Lippert habla sobre esto en Covariance y Contravariance en C #, Parte Dos: Covariance de Array :
Desafortunadamente, este tipo particular de covarianza está roto. Se agregó al CLR porque Java lo requiere y los diseñadores de CLR querían poder admitir lenguajes similares a Java. Luego subimos y lo agregamos a C # porque estaba en el CLR. Esta decisión fue bastante controvertida en ese momento y no estoy muy feliz por eso, pero no hay nada que podamos hacer al respecto ahora.
¿Por qué está roto? Porque siempre debería ser legal poner una tortuga en una variedad de animales. Con la covarianza de la matriz en el idioma y el tiempo de ejecución, no puede garantizar que una matriz de Animales pueda aceptar una Tortuga porque la tienda de respaldo podría ser una matriz de Jirafas.