¿Por qué la interfaz genérica no puede implementar el tipo dinámico?

7

Si es posible:

IList <dynamic> = new List <dynamic>;

o:

class A <T>
{
 A(T){}
}

class B: A <dynamic> {}

. Por qué no es posible hacer esto:

class U: IEnumerable <dynamic> {}

?

    
pregunta Ucho 12.06.2016 - 17:59

2 respuestas

10

Esto no está permitido, ya que Chris Burrows (quien ayudó a crear e implementar dynamic ) explica:

  

Bueno, en primer lugar, en realidad no te da nada que ya no tengas. Lo primero y lo segundo ya están ahí si implementó IEnumerable<object> . En ese caso, aún habría podido definir GetEnumerator como lo hicimos, y aún puede convertir C a IEnumerable<dynamic> (nuevamente, debido a las conversiones estructurales). Piénselo de esta manera: si alguien alguna vez mira directamente a su tipo C, nunca va a "ver" qué interfaces implementa. Solo los "ven" cuando lanzan, y en ese momento, IEnumerable<dynamic> no les hizo ningún bien.

     

Esa es una buena razón, pero podrías responder, ¿por qué no me dejas hacer esto de todos modos? ¿Por qué imponer esta limitación que parece artificial? Buena pregunta. Encontré esto por primera vez cuando intentaba que el compilador emitiera estas cosas, y me di cuenta muy rápidamente de que no tenía dónde emitir el atributo [Dynamic] que usamos para marcar tipos dinámicos. El equipo de metadatos informó que una lectura de la especificación de CLI parecía indicar que las tablas para las implementaciones de interfaz y los atributos personalizados podrían haberlo permitido, pero de todos modos, nadie de los que conocemos ha hecho esto, y habría sido un esfuerzo realizado. Tenemos prioridades y un presupuesto de tiempo limitado, y esto no fue suficiente.

    
respondido por el Mason Wheeler 12.06.2016 - 18:03
4

La forma más fácil de pensarlo: dinámica no es un tipo .

dynamic es una directiva de compilación que desactiva todas las verificaciones en tiempo de compilación y las implementa en el tiempo de ejecución en su lugar.

Cuando declara una variable dinámica:

dynamic t = 123;

t = t.Length;    // crashes at runtime

en realidad, está declarando que la variable es System.Object , luego desactive todas las comprobaciones en tiempo de compilación para expresiones que involucren esa variable:

object t = 123;

unchecked_for_errors
{
    t = t.Length;    
}

No puedes usar <dynamic> como si fuera un tipo, porque realmente no lo es.
Utilice <object> en su lugar.

    
respondido por el user147272 22.09.2016 - 11:38

Lea otras preguntas en las etiquetas