在C#中是否可以实现一个泛型类,其中定义在基本接口类型上,但实现是在从该基础派生的接口上?
我有一个具有核心功能的基类型,但我需要两种不同的变体,具体取决于我的进程是使用数据数据还是整数数据。
我可以克服我的基本类型以获得两种数据类型,但我宁愿不这样做。
问题示例:
public interface IA {}
public interface IB : IA {}
public class CA : IA {}
public class CB : IB {}
public interface IC<T1> where T1 : IA { }
public class C<TIa> : IC<TIa> where TIa : IA {}
public class Thing
{
public void Some()
{
IA a = new CB(); // fine IB is of type IA
C<IB> b = new C<IB>(); // fine - obviously
C<IB> y = new C<IA>(); // shouldn't work - doesn't work
C<IA> x = new C<IB>(); // even though IB is of type IA this is not acceptable
}
}
Cannot implicitly convert type 'ClassLibrary1.C<ClassLibrary1.IA>' to
'ClassLibrary1.C<ClassLibrary1.IB>' // this makes sense
Cannot implicitly convert type 'ClassLibrary1.C<ClassLibrary1.IB>' to
'ClassLibrary1.C<ClassLibrary1.IA>' // this should work - IB derives from IA
如果我无法在派生接口上实现泛型,那么我需要在现有应用程序上进行大量的重做。是否有某种简单的方法来实现它?
答案 0 :(得分:4)
如果将接口T1
的类型参数IC
声明为协变
public interface IC<out T1> where T1 : IA { }
然后您可以将C<IB>
的实例分配给IC<IA>
IC<IA> x = new C<IB>(); // works
但我不确定这是否能回答你的问题......