【发布时间】:2008-12-09 15:29:58
【问题描述】:
这可能是不可能的,但我有这个类:
public class Metadata<DataType> where DataType : struct
{
private DataType mDataType;
}
还有更多内容,但让我们保持简单。泛型类型(DataType)被 where 语句限制为值类型。我想要做的是列出这些不同类型的元数据对象(DataType)。如:
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<int>());
metadataObjects.Add(new Metadata<bool>());
metadataObjects.Add(new Metadata<double>());
这可能吗?
【问题讨论】:
-
我想知道与仅使用
List<object>相比,以下答案中的方法是否有任何真正的好处?他们不会停止装箱/拆箱,他们不会消除铸造的需要,最终,你会得到一个Metadata对象,它不会告诉你任何关于实际DataType的信息,我正在寻找解决方案解决这些问题。如果您要声明一个接口/类,只是为了能够将实现/派生的泛型类型放在泛型列表中,这与使用List<object>相比 多么不同除了没有意义的层? -
抽象基类和接口都通过限制可以添加到列表中的元素类型来提供一定程度的控制。我也看不出拳击是如何进入这个领域的。
-
当然,如果您使用的是 .NET v4.0 或更高版本,那么协方差就是解决方案。
List<Metadata<object>>成功了。 -
@0b101010 我也是这么想的,但不幸的是,值类型上不允许有差异。由于 OP 有一个
struct约束,它在这里不起作用。 See -
@0b101010,两者都只限制引用类型,任何内置值类型和任何结构仍然可以添加。此外,最后,您有一个
MetaData引用类型列表,而不是您的原始值类型,没有关于每个元素的基础值类型的(编译时)信息,这 实际上是“装箱” .