非泛型逆变

Non-Generic Contravariance

说我有这两个接口

public interface A
{

}

public interface B
{
   A a {get;}
}

以及这两个具体类型

public class ConcreteA : A
{
}

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

这不会编译,因为接口 B 需要接口 A 而不是 ConcreteA。

目前我正在使用接口自动生成代码,并且我 运行 进入了这个场景。我不想修改我所有的模型来实现和显式接口定义,其中 return 我的具体接口版本 class,我想使用某些版本的协方差来做到这一点,但我不是确定是否有办法做到这一点,或者这是否是 C# 的限制。

  1. 是否有允许我执行此操作的逆变的接口方式版本?

    1.1 如果没有,是否有一个明确的原因为什么它没有实现,或者是否有一个 senario 如果它被实现会有问题?

你必须让它通用才能工作

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 否则。