有沒有一種方法可以重載原語,例如添加雙打?我想在執行操作時自動舍入雙打。我目前的代碼是這樣的:重載原語運算符(C#)
class Test{
public static double operator +(double x, double y){
return Math.Round(x + y)
}
}
但有一個不幸的錯誤,說「一個二元運算符的參數必須是包含類型」。
有沒有一種方法可以重載原語,例如添加雙打?我想在執行操作時自動舍入雙打。我目前的代碼是這樣的:重載原語運算符(C#)
class Test{
public static double operator +(double x, double y){
return Math.Round(x + y)
}
}
但有一個不幸的錯誤,說「一個二元運算符的參數必須是包含類型」。
不能超負荷原始類型的運算符。這會在你的代碼庫中造成混亂。
你能做什麼,而不是,是創建一個圍繞基本類型的簡單包裝,讓我們說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>
來擴展它。
感謝您的支持! – JPtheK9 2015-02-11 00:29:49
不,這將是可怕的。使用你的圖書館的用戶會突然從他們的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);
}
非常感謝!爲了保持所有內容簡單明瞭,是否可以通過調用類自動調用Value?這樣,我的方式,我可以很容易地做Number = 1,而不是Number.Value = 1. – JPtheK9 2015-02-11 00:20:46
@ user2994455是的,使用'隱式'投射算子。 – BradleyDotNET 2015-02-11 00:29:27
感謝您的信息。我現在開始工作。 – JPtheK9 2015-02-11 00:30:19
你不能。值得慶幸的。 – 2015-02-11 00:14:33
這是爲什麼感恩? – JPtheK9 2015-02-11 00:15:09
因爲它提供了很少或沒有收益和巨大的潛在的錯誤。 – 2015-02-11 00:18:14