Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Error: The call is ambiguous between the following methods or properties. Overloading operators

I have 2 classes with overloaded operators in a namespace called Dinero, these are the 2 classes:

First one:

namespace Dinero
{
    class Dollar
    {
        #region Atributos

        public Double cant;

        #endregion

        #region Constructores

        public Dollar()
        {
            this.cant = 0;
        }

        public Dollar(Double amount)
        {
            this.cant = amount;
        }

        #endregion

        #region Sobrecarga de Operadores

        public static Dollar operator +(Euro eu, Dollar dol)
        {
            Dollar devolucion = new Dollar();

            devolucion.cant = eu.cant + (dol.cant * 1.3642);

            return devolucion;
        }

        public static Dollar operator -(Euro eu, Dollar dol)
        {
            Dollar devolucion = new Dollar();

            devolucion.cant = eu.cant + (dol.cant * 1.3642);

            return devolucion;
        }

        public static bool operator ==(Euro eu, Dollar dol)
        {
            if (eu.cant == (dol.cant * 1.3642))
                return true;
            else
                return false;
        }

        public static bool operator !=(Euro eu, Dollar dol)
        {
            if (eu.cant != (dol.cant * 1.3642))
                return true;
            else
                return false;
        }

        #endregion

    }
}

Second one:

namespace Dinero
{
    class Euro
    {
        #region Atributos

        public Double cant;

        #endregion

        #region Constructores

        public Euro()
        {
            this.cant = 0;
        }

        public Euro(Double amount)
        {
            this.cant = amount;
        }

        #endregion

        #region Sobrecarga de operadores

        public static Euro operator +(Euro eu, Dollar dol)
        {
            Euro devolucion = new Euro();

            devolucion.cant = eu.cant + (dol.cant * 1.3642);

            return devolucion;
        }

        public static Euro operator -(Euro eu, Dollar dol)
        {
            Euro devolucion = new Euro();

            devolucion.cant = eu.cant - (dol.cant * 1.3642);

            return devolucion;
        }

        public static bool operator ==(Euro eu, Dollar dol)
        {
            if (eu.cant == (dol.cant * 1.3642))
                return true;
            else
                return false;
        }

        public static bool operator !=(Euro eu, Dollar dol)
        {
            if (eu.cant != (dol.cant * 1.3642))
                return true;
            else
                return false;
        }

        #endregion

    }
}

And when I go to the main program ( I don't know how you guys call the main file, I'd like to know since I'm a total n00b ) and I type this:

namespace Ejercicio_21
{
    class Ejercicio_21
    {
        static void Main(string[] args)
        {
            Console.Title = "Ejercicio Nro 21";

            Euro euro00 = new Euro(1);
            Dollar dollar00 = new Dollar(1);

            Euro sumaEuros = euro00 + dollar00;

About the last line, the compiler says:

Error 11 The call is ambiguous between the following methods or properties: 'Dinero.Euro.operator +(Dinero.Euro, Dinero.Dollar)' and 'Dinero.Dollar.operator +(Dinero.Euro, Dinero.Dollar)'

I assume it has something to do with the different namespaces, but I couldn't figure it out, even using google.

This is the first question I ask here, so please, don't flame me to oblivion and please excuse my horrid English.

Note: I'm forced to keep Dollar and Euro classes in a different namespace than the main program.

Thank you in advance.

like image 274
Cristian Avatar asked Oct 18 '11 21:10

Cristian


People also ask

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.

Is C language easy?

Compared to other languages—like Java, PHP, or C#—C is a relatively simple language to learn for anyone just starting to learn computer programming because of its limited number of keywords.

Is C programming hard?

C is more difficult to learn than JavaScript, but it's a valuable skill to have because most programming languages are actually implemented in C. This is because C is a “machine-level” language. So learning it will teach you how a computer works and will actually make learning new languages in the future easier.


3 Answers

No, it's got nothing to do with different namespaces - it's that you've got the same operator signature declared in two places:

public static Dollar operator +(Euro eu, Dollar dol)
public static Euro operator +(Euro eu, Dollar dol)

The compiler doesn't know which one you want to call.

To be honest, I don't think adding a dollar value to a Euro value makes much sense to start with - but even beyond that, having the same operation "adding dollars to Euros" should have a single logical result type.

If you really want to make the two operations valid, I'd suggest having instance methods called Plus:

// In Dollar
public Dollar Plus(Euro eu)

// In Euro
public Dollar Plus(Dollar dol)

Then:

Euro euro00 = new Euro(1);
Dollar dollar00 = new Dollar(1);

Euro sumaEuros = euro00.Plus(dollar00);

Pretty much as clear, but without the ambiguity.

Another alternative which I don't recommend is to make (say) the first operand's type take priority:

public static Dollar operator +(Dollar dol, Euro eu)    
public static Euro operator +(Euro eu, Dollar dol)

Then you could do:

Dollar dol1 = ...;
Euro eu1 = ...;

Dollar dol2 = dol1 + eu1;
Euro eu2 = eu1 + do1;

It's pretty horrible though.

like image 87
Jon Skeet Avatar answered Nov 06 '22 04:11

Jon Skeet


It has to do with the fact that you declared

public static Your_Type operator +(Euro eu, Dollar dol)

in both classes. So your compiler don't know which one use...

like image 42
Marco Avatar answered Nov 06 '22 04:11

Marco


Solved this issue in VS 2015 by deleting duplicated code that was in both a project as well as a nuGet package. By unloading the project that had the duplicated code, the error went away.

like image 1
Mike Avatar answered Nov 06 '22 05:11

Mike