相关疑难解决方法(0)

通用类型参数协方差和多个接口实现

如果我有一个带有协变类型参数的泛型接口,如下所示:

interface IGeneric<out T>
{
    string GetName();
}
Run Code Online (Sandbox Code Playgroud)

如果我定义这个类层次结构:

class Base {}
class Derived1 : Base{}
class Derived2 : Base{}
Run Code Online (Sandbox Code Playgroud)

然后我可以使用显式接口实现在单个类上实现两次接口,如下所示:

class DoubleDown: IGeneric<Derived1>, IGeneric<Derived2>
{
   string IGeneric<Derived1>.GetName()
   {
     return "Derived1";
   }

   string IGeneric<Derived2>.GetName()
   {
     return "Derived2";
   }  
}
Run Code Online (Sandbox Code Playgroud)

如果我使用(非泛型)DoubleDown类并将其强制转换为IGeneric<Derived1>IGeneric<Derived2>按预期运行:

var x = new DoubleDown();
IGeneric<Derived1> id1 = x;        //cast to IGeneric<Derived1>
Console.WriteLine(id1.GetName());  //Derived1
IGeneric<Derived2> id2 = x;        //cast to IGeneric<Derived2>
Console.WriteLine(id2.GetName());  //Derived2
Run Code Online (Sandbox Code Playgroud)

但是,转换xIGeneric<Base>,给出以下结果:

IGeneric<Base> b = x;
Console.WriteLine(b.GetName());   //Derived1 …
Run Code Online (Sandbox Code Playgroud)

c# generics types interface covariance

44
推荐指数
4
解决办法
2977
查看次数

标签 统计

c# ×1

covariance ×1

generics ×1

interface ×1

types ×1