2013-12-11 123 views
-2

運算符重載我這樣定義的可空INT之間的加法:使用擴展方法

public static class Utils 
{ 
    public static int? operator +(int? value1, int? value2) 
    { 
     if (!value1.HasValue && !value2.HasValue) 
      return null; 

     int myValue1 = value1.HasValue ? value1.Value : 0; 
     int myValue2 = value2.HasValue ? value1.Value : 0; 

     return myValue1 + myValue2; 
    } 
} 

是否有可能在.NET 3.5使用該運營商?
在早期版本的.NET中可能嗎?

PS。

顯然其實沒有(?)的方式來超載運營商使用擴展方法 因爲擴展方法必須是靜態類和靜態類不能有運算符重載....

PPS。

「解決」 使用已經

public static int? Add(this int? value1, int? value2) 
+3

你試過編譯它? – dan04

+0

是的,代碼不能編譯,問題是可以或不可以構建這樣的東西。 – serhio

+0

如果它不能編譯,那麼你不能這樣做。另外,您通常會將操作員放在自定義類中,而不是其他現有數據類型的sudo擴展方法。 – gunr2171

回答

5

C# 「升降機」 所有運營商到空類型。
如果任一操作數爲null,則操作符將返回null。

你不需要(也不能)這樣做。

+0

「或者操作數爲null,運算符將返回null 「不符合我的需要......有沒有辦法來覆蓋這種行爲?我需要「null + 5」= 5 – serhio

+2

不,你不能。並且,可爲空的類型中的'null'點表示一個_unknown_數量。未知數量加五不是五;它也是未知的。 – SLaks

+2

你可以寫'(x ?? 0)+(y ?? 0)'。謹防優先。 – SLaks

2

運算符重載允許爲操作數指定用戶定義的運算符實現,其中一個或兩個操作數都是用戶定義的類或結構類型。

運算符重載您試圖實現不涉及任何結構或任何數據類型。這是你的代碼不編譯。

你可以找到相同的here

編輯參考:

你並不需要重載運營商,而不是使用這個

var result = value1.GetValueOrDefault() + value2.GetValueOrDefault(); 

此外,操作符重載實現在你的Type的範圍內,即類或結構。

您可以使用像這樣的擴展方法

public static class Utils 
    { 
     public static int? Sum(this int? value1, int? value2) 
     { 
      if (!value1.HasValue && !value2.HasValue) 
       return null; 

      int myValue1 = value1.HasValue ? value1.Value : 0; 
      int myValue2 = value2.HasValue ? value1.Value : 0; 

      return myValue1 + myValue2; 
     } 
    } 
+0

也不能使用擴展方法? – serhio

+0

擴展方法可以像sum等一樣使用。 – Akanksha

+0

value1.GetValueOrDefault()+ value2.GetValueOrDefault()如果兩者都爲null,則爲0,我不需要這個,在這種情況下我需要null。 – serhio