具有未指定类型的泛型类的数组

Han*_*esh 9 c# generics typing

在C#中是否可以创建一个未指定泛型类型的数组?有点像这样:

ShaderParam<>[] params = new ShaderParam<>[5];
params[0] = new ShaderParam<float>();
Run Code Online (Sandbox Code Playgroud)

或者这是不可能的,因为C#强大的打字?

Jon*_*eet 15

这是不可能的.在泛型类型受您控制的情况下,您可以创建非泛型基类型,例如

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

我的猜测是,这是一种你无法控制的XNA类型.


Jor*_*dão 7

可以使用协变接口ShaderParam<T>:

interface IShaderParam<out T> { ... }
class ShaderParam<T> : IShaderParam<T> { ... }
Run Code Online (Sandbox Code Playgroud)

用法:

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

但是你不能像float你的例子中那样使用值类型.协方差只与引用类型有效(比如string我的例子).如果类型参数出现在逆变位置,例如方法参数,则也无法使用它.不过,了解这项技术可能会很好.