字典-继承的类别

时间:2018-10-20 11:59:33

标签: c# dictionary

我有一个(希望)简单的问题:

我有一些课程:

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>的错误。

我该如何解决这个问题?

谢谢:)

2 个答案:

答案 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/