[英]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>>
即使Role
是Model<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.