2011-03-07 15 views

Respuesta

15

No es posible. En el caso en que el tipo genérico esté bajo su control, puede crear un tipo base no genérico, p.

ShaderParam[] params = new ShaderParam[5]; // Note no generics 
params[0] = new ShaderParam<float>(); // If ShaderParam<T> extends ShaderParam 

Supongo que este es un tipo de XNA del que no tiene control.

+0

No es, es mi propia clase;). Probándolo ahora. – Hannesh

2

Eso no tendría sentido.

¿Qué pasaría si escribes params[3]?
¿Qué tipo sería?

Es posible que desee crear una clase o interfaz base no genérica y utilizar una matriz de ellas.

1

Esto es posible en una clase genérica o un método extensión genérica donde se define T:

ShaderParam<T>[] params = new ShaderParam<T>[5]; 
1

No, el concepto ShaderParam<> no tiene sentido en la medida que se refiere a un tipo instanciado. En otras palabras, un ShaderParam<float> concreto es no una instancia de ShaderParam<>. Por lo tanto, el tipo declarado de la matriz sería ilegal para contener esa instancia. (Por encima y más allá del hecho de que ya es sintaxis ilegal para empezar.)

0

No directamente. Un genérico cerrado es un "tipo" específico detrás de escena, por lo que incluso un genérico abierto es demasiado general para ser un "tipo fuerte".

La mejor solución que puedo pensar, que he usado antes, es crear un ancestro no genérico para la clase genérica. Si esa solución funcionará o no depende de lo que planee usar la matriz.

1

crear una matriz de tipos genéricos no especificados:

Object[] ArrayOfObjects = new Object[5]; 
ArrayOfObjects[0] = 1.1; 
ArrayOfObjects[1] = "Hello,I am an Object"; 
ArrayOfObjects[2] = new DateTime(1000000); 

System.Console.WriteLine(ArrayOfObjects[0]); 
System.Console.WriteLine(ArrayOfObjects[1]); 
System.Console.WriteLine(ArrayOfObjects[2]); 

Si necesita realizar algunas acciones específicas de características del objeto que podría utilizar la reflexión

Espero que esto ayude.

7

Usted podría utilizar una interfaz covariante para ShaderParam<T>:

interface IShaderParam<out T> { ... } 
class ShaderParam<T> : IShaderParam<T> { ... } 

Uso:

IShaderParam<object>[] parameters = new IShaderParam<object>[5]; 
parameters[0] = new ShaderParam<string>(); // <- note the string! 

Pero no se puede utilizar con los tipos de valor como float en tu ejemplo . La covarianza solo es válida con tipos de referencia (como string en my ejemplo). Usted también no puede usar si el parámetro de tipo aparece en posiciones contravariantes, p.como parámetros del método. Aún así, podría ser bueno saber sobre esta técnica.

Cuestiones relacionadas