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.
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 ...
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.
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.
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.
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.
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...
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With