[Mono-devel-list] Incorrect interpretation of operator arguments?
Anders Gustafsson
anders.gustafsson at cureos.com
Tue Jun 8 12:54:39 EDT 2004
This might be a general C# language question; if that is so, I am sorry
in beforehand that I have posted the issue in this forum :-)
To follow-up on my bug report (#59694, see
http://bugzilla.ximian.com/show_bug.cgi?id=59694), I made a simple test
program, TestClass.cs:
*****
using System;
class TestClass
{
private int mX;
public TestClass(int iX)
{
mX = iX;
}
public static TestClass operator+(TestClass iLhs, TestClass iRhs)
{
TestClass ret = iLhs;
ret.mX = ret.mX + iRhs.mX;
return ret;
}
public static void Main(string[] args)
{
TestClass t1 = new TestClass(10);
TestClass t2 = new TestClass(20);
TestClass t3 = t1 + t2;
Console.WriteLine("t1 is " + Convert.ToString(t1.mX) + ", should
be 10");
Console.WriteLine("t2 is " + Convert.ToString(t2.mX) + ", should
be 20");
Console.WriteLine("t3 is " + Convert.ToString(t3.mX) + ", should
be 30");
}
}
****
Upon compiling (mcs TestClass.cs or gmcs TestClass.cs) and running (mono
TestClass.exe) it, I get the following output (Mono 1.0 Beta 2, Fedora
Core 2, Linux kernel 2.6.5-1.358):
****
t1 is 30, should be 10
t2 is 20, should be 20
t3 is 30, should be 30
****
i.e. t1 is modified in the addition operation t3 = t1 + t2 !
As far as I understand, arguments are passed by value if not explicitly
specified otherwise (ref, out; see e.g. ECMA-334 C# Language
Specification, secs. 8.3 and 17.5.1). In fact, according to ECMA-334
sec. 17.9, operator parameters are required to be value parameters.
And, even if the arguments were passed by reference, I would have
expected the statement
TestClass ret = iLhs;
in the operator+ method to make a copy of iLhs's value (ECMA-334, sec.
14.13.1), not make a reference to the same memory location.
Now, this problem is not confined to Mono. I have compiled the same
source code with Microsoft.NET compiler csc (through Borland C#
Builder), and I get the same result as with Mono!
So, maybe I am missing something fundamental here. I am grateful for any
answer or comment that could shed light on issue.
Kind regards,
Anders Gustafsson
Cureos AB
More information about the Mono-devel-list
mailing list