2016-02-04 70 views
-1

爲自定義類的向量和矩陣之間的數學運算編寫代碼我遇到了一個奇怪的問題(至少對我而言)。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 + ")"; } 
    } 
} 
+0

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 – mybirthname

+3

運算符中的參數變化必然會引起混淆。沒有人期待操作員的這些副作用。 –

+2

'clsB'的運算符沒有創建新的實例。它們在表達式的評估過程中*改變*操作數的屬性。因此,在其表達式中使用兩次的「B2」屬性對於兩種不同的操作具有不同的值。 –

回答

1

您的+運營商Type2是borked的,您不應修改運營商的輸入。

運營商對結合輸入操作輸入和返回的新結果。

+0

是的,我已經將結構應用於所有使用重載操作符的類。現在它快了大約30%。 但我在例子中解釋的問題仍然不清楚。 正如在MSDN中提到的:[link](https://msdn.microsoft.com/EN-US/library/8f1hz171(v = VS.140,d = hv.2).aspx) 「...更改當控制回到調用過程時,值不會被保留。「 在我的示例中,當我使用重載操作符或調用函數「test」時,參數值在控件傳回給調用過程後發生更改。 所以。怎麼了? – Dennis

+0

呃,它確實在做你所要求的。添加輸入,然後將其中一個輸入值設置爲等於結果..運算符與函數沒有區別,因爲它們通過引用獲取輸入,並可以修改它們的值。 – Henrik

+0

文檔@丹尼斯提到談論通過價值與傳遞引用,而不是「傳遞*參考」,所以雖然他引用的文檔在技術上是正確的,但與他的問題無關。 –