非泛型逆变
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 如果没有,是否有一个明确的原因为什么它没有实现,或者是否有一个 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
否则。
说我有这两个接口
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 如果没有,是否有一个明确的原因为什么它没有实现,或者是否有一个 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
否则。