C#泛型方法值

时间:2017-01-28 10:03:29

标签: c# .net linq templates generics

我需要编写方法,在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>>

2 个答案:

答案 0 :(得分:3)

此处的错误是NULLList<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>>