2015-02-11 143 views
1

有沒有一種方法可以重載原語,例如添加雙打?我想在執行操作時自動舍入雙打。我目前的代碼是這樣的:重載原語運算符(C#)

class Test{ 
    public static double operator +(double x, double y){ 
     return Math.Round(x + y) 
    } 
} 

但有一個不幸的錯誤,說「一個二元運算符的參數必須是包含類型」。

+1

你不能。值得慶幸的。 – 2015-02-11 00:14:33

+0

這是爲什麼感恩? – JPtheK9 2015-02-11 00:15:09

+0

因爲它提供了很少或沒有收益和巨大的潛在的錯誤。 – 2015-02-11 00:18:14

回答

1

不能超負荷原始類型的運算符。這會在你的代碼庫中造成混亂。

你能做什麼,而不是,是創建一個圍繞基本類型的簡單包裝,讓我們說RoundedDouble

public struct RoundedDouble : IEquatable<RoundedDouble>, IComparable<RoundedDouble> 
{ 
    public readonly double Value; 

    public RoundedDouble(double value) 
    { 
     Value = Math.Round(value); // Or anything else 
    } 

    public static implicit operator RoundedDouble(double value) 
    { 
     return new RoundedDouble(value); 
    } 

    public static implicit operator double(RoundedDouble wrapper) 
    { 
     return wrapper.Value; 
    } 

    public int GetHashCode() 
    { 
     return Value.GetHashCode(); 
    } 

    public bool Equals(object other) 
    { 
     if (other is RoundedDouble) 
      return ((RoundedDouble)other).Value == Value; 

     return false; 
    } 

    public string ToString() 
    { 
     return Value.ToString(); 
    } 

    // Add your operators here, and implement the interfaces 
} 

這是一個結構。它具有與double相同的值語義。

通過添加運營商並通過實施至少IEquatable<RoundedDouble>IComparable<RoundedDouble>來擴展它。

+0

感謝您的支持! – JPtheK9 2015-02-11 00:29:49

4

不,這將是可怕的。使用你的圖書館的用戶會突然從他們的double變量中獲得不同的行爲!

可以寫和使用,一個包裝對象:

public struct MyDouble 
{ 
    public double Value {get; set;} 

    public MyDouble(double initValue) 
    { 
     Value = initValue; 
    }   

    public static double operator +(MyDouble x, MyDouble y){ 
     return Math.Round(x.Value + y.Value) 
    } 
} 

你也可以把它強制轉換爲/從雙,其他選項。這樣用戶知道他們正在使用你的對象,並且當他們的數學運算被舍入時不會感到驚訝。

如果你想從一個簡單的雙重分配,你需要定義一個隱含運營商,類似的Nullable<T>source):

public static implicit operator MyDouble(double value) { 
      return new MyDouble(value); 
     } 
+0

非常感謝!爲了保持所有內容簡單明瞭,是否可以通過調用類自動調用Value?這樣,我的方式,我可以很容易地做Number = 1,而不是Number.Value = 1. – JPtheK9 2015-02-11 00:20:46

+0

@ user2994455是的,使用'隱式'投射算子。 – BradleyDotNET 2015-02-11 00:29:27

+0

感謝您的信息。我現在開始工作。 – JPtheK9 2015-02-11 00:30:19