爲自定義類的向量和矩陣之間的數學運算編寫代碼我遇到了一個奇怪的問題(至少對我而言)。C#重載運算符給出了不同的結果
類型之間的重載運算符在不同的地方給出不同的結果。我挖掘出該操作的結果對「運營商+(...)」內部如何創建新實例很敏感。
我已經創建了顯示差異的簡單代碼(見下文)。 兩個班正在做同樣的事情,預計會有相同的結果,但實際上並不相同。 Type2的重載操作符和「test」函數修改變量。 我還沒有在MSDN中發現任何警告。這種行爲並不直接由語法標記(由「ref」關鍵字引起)。
任何人都可以推薦一個關於這個問題的鏈接? 它預測的行爲或C#語法中的錯誤?
using System;
namespace test_operator_overload
{
class Program
{
static void Main()
{
Type1 A1 = new Type1(1);
Console.WriteLine(A1); // 1 - OK
Console.WriteLine(A1 + A1); // 2 - OK
Console.WriteLine(A1); // 1 - OK
Console.WriteLine();
Type2 B1 = new Type2(1);
Console.WriteLine(B1); // 1 - OK
Console.WriteLine(B1 + B1); // 2 - OK
Console.WriteLine(B1); // 2 - Not OK
Console.WriteLine();
Type2 C1 = new Type2(1);
Console.WriteLine(C1); // 1 - OK
Console.WriteLine(test(C1)); // 2 - OK
Console.WriteLine(C1); // 2 - Not OK
}
static Type2 test(Type2 a)
{
a.x += 1;
return a;
}
}
class Type1
{
public double x;
public Type1(double x)
{
this.x = x;
}
public static Type1 operator +(Type1 a, Type1 b)
{
return new Type1(a.x + b.x);
}
public override string ToString() { return GetType().Name + " (" + x + ")"; }
}
class Type2
{
public double x;
public Type2(double x)
{
this.x = x;
}
public static Type2 operator +(Type2 a, Type2 b)
{
a.x += b.x;
return a;
}
public override string ToString() { return GetType().Name + " (" + x + ")"; }
}
}
尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 – mybirthname
運算符中的參數變化必然會引起混淆。沒有人期待操作員的這些副作用。 –
'clsB'的運算符沒有創建新的實例。它們在表達式的評估過程中*改變*操作數的屬性。因此,在其表達式中使用兩次的「B2」屬性對於兩種不同的操作具有不同的值。 –