Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非一般对冲_C#_Inheritance_Interface_Covariance - Fatal编程技术网

C# 非一般对冲

C# 非一般对冲,c#,inheritance,interface,covariance,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而不是具体的A 目前我正在用接口自动生成代码,我遇到了这个senario。我不想修改我的所有模型来实现和显式的接口

假设我有这两个接口

public interface A
{

}

public interface B
{
   A a {get;}
}
这两种具体的类型

public class ConcreteA : A
{
}

public class ConcreteB : B
{
   public ConcreteA a {get;}
}
这不会编译,因为接口B需要的是接口A而不是具体的A

目前我正在用接口自动生成代码,我遇到了这个senario。我不想修改我的所有模型来实现和显式的接口定义,在这些接口定义中将返回我的具体类的接口版本,我想使用协方差的某个版本来实现这一点,但我不确定是否有办法做到这一点,或者这是否是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;}
    }
    

    无法强制您仅将其设置为
    ConcreteA
    否则。

    您需要泛型,因为
    B=new ConcreteB()
    将允许您将
    a
    设置为实现
    a
    的任何内容,而不仅仅是
    ConcreteA
    @juharr。谢谢,我看得太多了。假设你只得到了界面,仍然可以做,但这将是一个具体的利基使用你的权利,我会接受这作为一个答案,当时间限制允许我
    B b = new ConcreteB();
    b.a = AnythingThatImplementsA;