2017-02-13 37 views
1

我有一个类A用5构造:“呼叫是下列方法或属性之间暧昧”上子类

  • IEnumerable<A>(例如A(new A[] {A1, A2})
  • A[]使用params(快捷方式前一个,例如A(A1, A2)
  • Vector<Complex>
  • IEnumerable<Complex>(转换枚举到向量和调用以前一个,例如。 A(new Complex[] {Complex1, Complex2})
  • 从使用params(快捷方式之前的一个,例如A(Complex1, Complex2)

那与3个具体的构造延伸AB

  • Complex a, Complex b
  • double a, double b, double c, double d
  • from下方

代码:

Error CS0121 The call is ambiguous between the following methods or properties: 'A.A(params A[])' and 'A.A(params Complex[])'

我想构造为:

public class A 
{ 
    public A(params A[] array) : this((IEnumerable<A>)array) { } 

    public A(IEnumerable<A> enumerable) 
    { 
     // 
    } 

    public A(params Complex[] array) : this((IEnumerable<Complex>)array) { } // Breaks shit 

    public A(IEnumerable<Complex> enumerable) : this(Vector<Complex>.Build.DenseOfEnumerable(enumerable)) { } 

    public A(Vector<Complex> vector) 
    { 
     // 
    } 
} 

public class B : A 
{ 
    public B(Complex a, Complex b) 
    { 
     // 
    } 

    public B(double a, double b, double c, double d) 
    { 
     // 
    } 

    public B(double a, double b) 
    { 
     // 
    } 
} 

完成投入使用构造函数A,对A所有三个构造出现以下错误没有继承,父类中的新构造函数如何干扰子类中的构造函数?如何解决这个问题?

,是我用来允许各种等同类型的输入(例如两个A(Complex1, Complex2)A(ComplexArray)A(ComplexVector))好的做法还是应该采取不同的模式?

+0

你说:'在添加与复杂的[]以B'的构造函数,但我没有看到这样的构造函数在'B' 。你的意思是'A'? – CodingYoshi

+0

你是对的,谢谢你的注意。 – lamasticot

回答

2

构造函数按从基类第一个到最后一个继承类的顺序运行。

public B(Complex a, Complex b) 
{ 
    // 
} 

等于

public B(Complex a, Complex b) : base() 
{ 
    // 
} 

编译器试图找到碱型(A),它可以接受任何参数的构造。 因为PARAMS的关键字有两个候选人:

public A(params A[] array) : this((IEnumerable<A>)array) { } 

public A(params Complex[] array) { } 

您收到的错误,因为编译器不能决定哪一个应该被使用。为了解决这个问题,你可以重写构造为B类使用的基类的构造函数:

public B(Complex a, Complex b) : base(a, b) 
{ 
    // 
} 
+0

谢谢,没有意识到即使未明确指定,也会调用基础构造函数。 – lamasticot

0

我希望我能正确理解你的问题。

您无法重写基类的构造函数。如果B继承自A,并且两个类都具有相同签名的构造函数,则不起作用。基类的构造函数总是被执行,但是如果你仍然需要实现两个相同的构造函数,你可以使用base关键字。

在您R情形应该是:

public class B : A 
{ 
    public B(Complex a, Complex b) : base(a, b) 
    { 
     // Do some code here 
    } 

    public B(double a, double b, double c, double d) 
    { 
     // 
    } 

    public B(double a, double b) 
    { 
     // 
    } 
} 

两个构造仍会执行,但现在你可以在B类的构造函数编写逻辑。