我需要编写方法,在List
中返回泛型类的子代。我写了这样的话:
static List<Model<T>> Get<T>( string value ) where T : Model<T>
{
switch( value )
{
case "ROLE":
return GetRoles();
}
return new List<Model<T>>();
}
GetRoles()
返回List<Role>
,其中Role : Model<Role>
。
但是visual studio告诉我它无法将List<Role>
转换为List<Model<T>>
。
答案 0 :(得分:3)
此处的错误是NULL
与List<Role>
不同,即使List<Model<T>>
是Role
示例,您有两个类:
Model<Role>
并创建一个列表:
public class Bar : Model<Foo>
{
}
public class Foo : Model<Foo>
{
}
如果您可以将其投放到var fooList = new List<Foo>();
:
List<Model<Foo>>
比您应该能够添加新的条形列表:
var modelList = (List<Model<Foo>>) fooList ; // not possible
但这仍然是modelList.Add(new Bar());
的列表,它可能只有Foo对象。
作为解决方案,您可以尝试将角色转换为模型:
Foo
答案 1 :(得分:1)
这里的问题是List<T>
不是协变。这意味着如果你被允许这样做,调用者会认为它有一个List<Model<T>>
但实际上会有List<Role>
- 如果你然后尝试添加另一个派生自{的类的实例{1}}到列表中它会失败。 C#不会让你这样做。
相反,您可以使用以下方法将结果显式转换为Model<T>
List<Model<T>>