2009-11-14 31 views

Respuesta

54

En la práctica la terminología realmente no importa mucho - No puedo recordar la última vez que tuve que preocuparme salvo cuando intenta escribir sobre él.

  • Un no unido tipo no tiene argumentos tipo especificado
  • Un tipo construido ha al menos un tipo argumento especificado
  • un parámetro de tipo es un tipo abierto
  • un tipo de matriz donde el tipo de elemento está abierto es tipo abierto
  • Un abierto tipo construido tiene al menos un argumento tipo que es un tipo abierto
  • A cerrado tipo es cualquier tipo que no está abierto

(Hay otras reglas para tipos anidados. . Consultar la sección spec C# 3.0 4.4 para detalles morbosos)

Como un ejemplo de un tipo construido abierto, considere:

public class NameDictionary<T> : Dictionary<string, T> 

La clase base de typeof(NameDictionary<>) es:

  • Construido porque especifica los argumentos de tipo
  • Abierto porque el segundo argumento de tipo (T) es un tipo abierto

Los documentos de MSDN para Type.IsGenericType tienen una tabla bastante útil.

Solo para reiterar, esto es casi completamente sin importancia en el uso diario.

Estoy generalmente a favor de conocer la terminología correcta, en particular para cosas como "pasar por referencia", etc., pero en este caso realmente, realmente no aparece muy a menudo. Me gustaría desanimarlo activamente para que no se preocupe :)

+0

Ahora un día la mayoría de las preguntas de la entrevista que enfrenté se preguntan desde su libro. Por lo tanto, para fines de aclaración, pregunté. :). – user196546

+10

@generixs: Si alguien me preguntara en una entrevista, confesaría que no podría decir sin consultar un libro o las especificaciones :) No es una pregunta de entrevista muy útil, tengo que decir. –

+1

:) dame una parte de tu cerebro, para que pueda responder como si fuera un Jon Skeet .. (lo siento por broma ...). – user196546

6

De MSDN:

un tipo genérico o método se cierra si tipos instanciables han sido sustituidos para todos sus parámetros de tipo, incluyendo todos los parámetros de tipo de todo tipo de cerramiento. Solo puede crear una instancia de un tipo genérico si está cerrado.

Así que esto funciona como List<int> es cerrado:

var list = Activator.CreateInstance(typeof(List<int>)); 

Pero esto produce una excepción en tiempo de ejecución debido a List<> es abierta:

var list = Activator.CreateInstance(typeof(List<>)); 
               ↑ 
+2

En ese caso también es un tipo desatado - un tipo abierto, construido es el tipo más esotérico :) –

2

He usado sobre todo genéricos abiertos (genéricos básicamente desinstalados) en mapeos de inyección de dependencia. Por ejemplo, algo así como

Bind<IRepository<>>() 
    .To<BasicRepository<>>() 

Entonces, cuando mi constructor de objeto contiene:

public SomethingController(IRepository<Something>) { ... } 

Mi mecanismo de inyección de dependencia será una instancia de un BasicRepository < Algo> automágicamente. (Esto funciona con Ninject y StructureMap, y probablemente con la biblioteca Castle Windsor; no estoy seguro de otros frameworks).

+0

'Autofac' también admite tipos genéricos abiertos: [Autofac - crear componentes] (https://code.google.com/p/ autofac/wiki/ComponentCreation # Open_Generic_Types) – sgnsajgon

+0

Al igual que [SimpleInjector] (http://simpleinjector.readthedocs.org/en/latest/advanced.html#registration-of-open-generic-types) –