net mvc from create asp c# .net casting c#-6.0 .net-4.6

c# - mvc - ¿Por qué falla la actualización de IDictionary<TKey, TValue> a IEnumerable<object>?



lambda to dictionary c# (4)

Vea el siguiente fragmento de código:

(IEnumerable<object>)new Dictionary<string, string>()

El lanzamiento anterior lanzará una excepción de lanzamiento inválida

En realidad, IDictionary<TKey, TValue> también implementa indirectamente IEnumerable<out T> , porque también implementa ICollection<T> . Es decir, todo el elenco debe ser válido.

De hecho, para mí es aún más extraño que, si ejecuto todo el reparto en una ranura del reloj del depurador, ¡ funcione !

¿Que esta pasando?


Creo que esto se debe a que KeyValuePair es un tipo de valor.

Esto fallaría:

List<int> ints = new List<int>(); var objs = (IEnumerable<object>)ints;

Esto funcionaría:

List<string> ints = new List<string>(); var objs = (IEnumerable<object>)ints;

Lo mismo ocurre con el diccionario.


Ese diccionario implementa IEnumerable<KeyValuePair<TKey, TValue>> e IEnumerable , pero IEnumerable de una estructura no es lo mismo que IEnumerable de un objeto. La varianza solo funciona para tipos de referencia .

Esto funciona en mi extremo y debería ser la opción lógica:

var x = (IEnumerable)new Dictionary<string, string>();

Como muestra, esto funciona:

List<string> l = new List<string>(); var x = (IEnumerable<object>)l;

Pero este no lo hace:

List<DateTime> l2 = new List<DateTime>(); var x = (IEnumerable<object>)l2;

Indicar claramente la estructura es el problema.

(Por qué funciona en tus ventanas de vigilancia, no lo sé)


Esto es extraño. Su fragmento de código funciona bien con .NET 4.0. Te sugiero que lances a IEnumerable .

Leer: Interfaz IDictionary (MSDN)


Si realmente no puedes vivir con IEnumerable , prueba esto:

new Dictionary<string, string>().Cast<object>();