我有一个我从数据库填写的课程:
public class Option<T>
{
public T Value { get; set; }
public T DefaultValue { get; set; }
public List<T> AvailableValues { get; set; }
}
我希望收集它们:
List<Option<T>> list = new List<Option<T>>();
Option<bool> TestBool = new Option<bool>();
TestBool.Value = true;
TestBool.DefaultValue = false;
list.Add(TestBool);
Option<int> TestInt = new Option<int>();
TestInt.Value = 1;
TestInt.DefaultValue = 0;
list.Add(TestInt);
它似乎不起作用。想法?
答案 0 :(得分:12)
我怀疑你真的想要一个非通用的基类 - 否则不同的Option<T>
封闭类型之间没有任何共同点。
我理解你要做的是什么,但.NET泛型不允许你表达这种关系。这就像尝试从Type
到该类型的实例的地图......它只是不会飞:(
答案 1 :(得分:7)
您必须提供类型而不是模板参数:
List<Option<T>> list = new List<Option<T>>();
变为
List<Option<bool>> list = new List<Option<bool>>();
将Option<int>
类型的项目添加到同一个列表中将不起作用,但这是一个与我上面提到的问题不同的问题。
答案 2 :(得分:0)
第一行你必须说T型是什么。
List<Option<bool>> list = new List<Option<bool>>();
而且你也不能把那个TestIng放在这个列表中......
答案 3 :(得分:0)
您所做的只适用于异构列表。
List<T>
是T
类型的同类列表,意思是所有元素都必须是T
类型。由于Option<bool>
和Option<int>
没有object
以外的共同祖先,除非您使用List<object>
或旧ArrayList
,否则您无法做到这一点其中充当异类列表。
考虑从该列表中检索对象:
list.Add(TestBool);
list.Add(TestInt);
for(int i = 0; i < list.Count; i++)
{
list[i].Value // <- what's the type of this?
}