非一般逆差

时间:2016-07-01 17:47:09

标签: c# inheritance interface covariance

说我有这两个接口

public interface A
{

}

public interface B
{
   A a {get;}
}

这两种具体类型

public class ConcreteA : A
{
}

public class ConcreteB : B
{
   public ConcreteA a {get;}
}

这不能编译,因为接口B期望接口A而不是ConcreteA。

目前我正在自动生成带接口的代码,我遇到了这个senario。而不是修改我的所有模型来实现和显式接口定义,其中将返回我的具体类的接口版本,我想使用某种版本的协方差来做到这一点,但我不确定是否有办法做这或如果这是C#的限制。

  1. 是否存在允许我这样做的逆向变换的接口方式?

    1.1如果没有明确的理由说明为什么没有实施,或者是否存在一个问题,如果这是实施的话?

1 个答案:

答案 0 :(得分:2)

你必须使它成为通用的

public interface B<T> where T : A
{
   T a {get; set;}
}

public class ConcreteA : A
{
}

public class ConcreteB : B<ConcreateA>
{
   public ConcreteA a {get; set;}
}

那是因为

B b = new ConcreteB();
b.a = AnythingThatImplementsA;

无法强迫您仅将其设置为ConcreteA的其他内容。