簡體   English   中英

C#泛型方法值

[英]C# generic method value

我需要編寫方法,返回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>>

這里的錯誤是List<Role>List<Model<T>>即使RoleModel<Role>

例如,您有兩個類:

public class Bar : Model<Foo>
{

}

public class Foo : Model<Foo>
{

}

並創建一個列表:

var fooList = new List<Foo>();

如果你可以將它List<Model<Foo>>List<Model<Foo>>

var modelList = (List<Model<Foo>>) fooList ; // not possible

比你應該能夠添加新的條形列表:

modelList.Add(new Bar());

但這仍然是Foo的列表,它可能只有Foo對象。

作為解決方案,您可以嘗試將角色轉換為模型:

static List<Model<T>> Get<T>(string value)  where T:Model<T>
{
    switch (value)
    {
        case "ROLE":
            return GetRoles().Cast<Model<T>>().ToList();
            break;
    }
    return new List<Model<T>>();
}

這里的問題是List<T>不是協變的 這意味着如果你被允許這樣做,調用者會認為它有一個List<Model<T>>但實際上會有一個List<Role> - 如果你然后嘗試添加一個派生自另一個類的實例Model<T>到你的列表它會失敗。 C#不會讓你這樣做。

相反,您可以使用以下方法將結果顯式轉換為List<Model<T>>

return new List<Model<T>>(GetRoles());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM