我有一个(希望)简单的问题:
我有一些课程:
class Foo
class Foo1 : Foo
class Foo2 : Foo
我有两个字典:
Dictionary<int, Foo1> dic1
Dictionary<int, Foo2> dic2
我有一个方法:
private static int Method(Dictionary<int, Foo>)
和方法调用:
Method(dic1);
但是现在我收到了无法将Dictionary<int, Foo1>
转换为Dictionary<int, Foo>
的错误。
我该如何解决这个问题?
谢谢:)
答案 0 :(得分:12)
约束为Foo
的泛型应该这样做
public class Foo { }
public class Foo1 : Foo { }
public class Foo2 : Foo { }
public class SomeClass
{
public static int Method<T>(Dictionary<int, T> dict) where T : Foo
{
...
}
}
其他资源
Constraints on type parameters (C# Programming Guide)
约束将类型参数的功能告知编译器 一定有。没有任何约束,类型参数可以是任何 类型。编译器只能假定Object的成员,即 任何.NET类型的最终基类。
...
通过限制type参数,可以增加 允许的操作和方法调用 约束类型及其继承层次结构中的所有类型。当你 设计通用类或方法(如果要执行任何操作) 除了简单的分配或调用外,对泛型成员的操作 System.Object不支持的任何方法,则必须应用 类型参数的约束。
...
例如,基类约束告诉编译器 此类型或从此类型派生的对象将用作类型 论点。编译器获得此保证后,便可以允许方法 在泛型类中要调用的类型。
答案 1 :(得分:0)
除了限制Dictionary的类型外,还有两个功能可支持此功能:协方差和相反。
它们使您可以像对待另一种类型一样对待更多/更少派生类型的集合。因此,可以像为Foo1[]
变量分配Foo[]
一样,将Foo1
分配给Foo
。
以下是有关母题的全部文章: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/covariance-contravariance/