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类型.
您可以使用协变接口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在我的例子).如果类型参数出现在逆变位置,例如方法参数,则也无法使用它.不过,了解这项技术可能会很好.