在C#中可能创建一个未指定泛型类型的数组吗?或者这是根本不可能的,因为C#的强打字?这是不是因为C#的强打字而不可能?未指定类型的泛型类的数组
9
A
回答
15
这是不可能的。在通用类型受您控制的情况下,您可以创建一个非泛型基类型,例如
ShaderParam[] params = new ShaderParam[5]; // Note no generics
params[0] = new ShaderParam<float>(); // If ShaderParam<T> extends ShaderParam
我的猜测是,这是你无法控制的,虽然一个XNA类型。
2
这没有意义。
如果你写params[3]
会发生什么?
是什么类型?
您可能想创建一个非泛型基类或接口并使用它们的数组。
1
这是可能在通用类或通用扩展方法其中T的定义:
ShaderParam<T>[] params = new ShaderParam<T>[5];
1
否,就一个实例化的类型而言的概念ShaderParam<>
是无意义的。换句话说,一个具体的ShaderParam<float>
是而不是ShaderParam<>
的一个实例。因此,该数组的声明类型对于保存该实例将是非法的。 (超出事实,它已经是非法的语法开头。)
0
不是直接。封闭泛型是幕后特定的“类型”,所以即使是开放式泛型也太笼统,不能成为“强类型”。
我能想到的,我以前用过的最好的解决方案是为泛型类创建一个非泛型的祖先。该解决方案的功能是否取决于您计划使用阵列的方式。
1
创建未指定泛型类型的数组:
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]);
如果您需要执行的对象,你可以使用反射
希望这有助于某种类型的具体行动。
7
您可以使用ShaderParam<T>
协变接口:
interface IShaderParam<out T> { ... }
class ShaderParam<T> : IShaderParam<T> { ... }
用法:
IShaderParam<object>[] parameters = new IShaderParam<object>[5];
parameters[0] = new ShaderParam<string>(); // <- note the string!
但你不能与值类型使用它像float
在您例子。协方差只适用于参考类型(例如string
在我的示例中)。如果类型参数出现在逆变位置,例如也不能使用。作为方法参数。不过,了解这种技术可能是一件好事。
1
相关问题
- 1. 扩展泛型而不指定类型参数的非泛型类型
- 2. 指定属于一小组类型的泛型参数
- 3. 未指定类型的返回类型
- 4. 没有指定泛型类型的Swift类型转换
- 5. 可选的泛型类型,而无需手动指定类型
- 6. 指定类型约束上的通用泛型类型
- 7. 未指定类型参数
- 8. 定义类泛型类型
- 9. 如何指定一类特定的泛型类型?
- 10. 您在哪里指定泛型类型?
- 11. 泛型列表方法指定类型
- 12. 类型约束的Swift泛型数组
- 13. 强类型数组的泛型向量
- 14. 在参数匹配指定泛型类类型
- 15. 带泛型类型参数的网络泛型类型
- 16. 泛型类没有泛型函数中的类型参数
- 17. 如何在泛型的where子句中指定泛型类?
- 18. 如何使用泛型类型的泛型列表泛型类
- 19. 未绑定泛型类型的C#基类不可用?
- 20. 泛型类型类
- 21. 在构造函数中指定重复的泛型类型?
- 22. 泛型类型和泛型类型定义有什么区别?
- 23. Dafny泛型类型数组错误
- 24. 泛型类型参数和类型
- 25. 泛型类型参数不是类型?
- 26. 泛型类型定义
- 27. 泛型类型
- 28. 泛型类型
- 29. 泛型类型作为泛型类型参数
- 30. 如何指定泛型类型作为函数参数
这不是,这是我自己的类)。现在尝试。 – Hannesh 2011-03-07 17:28:04