2008-12-08 21 views
36

是否可以重寫C#中的類的空合併運算符?可能重寫null-coalescing運算符?

說例如我想返回一個默認值,如果一個實例爲空,並返回實例,如果它不是。該代碼看起來像這樣的事情:

return instance ?? new MyClass("Default"); 

但如果我想使用空合併運算符還檢查MyClass.MyValue設置?

當然沒有真正的需要(至少我這麼認爲) - 所以在你回答「你爲什麼要這樣做」之前 - 我只是好奇,如果有可能

+0

帕特里克,用途:我想超載弦的空合併運算考慮空爲空。無論這是明智的還是其他的,這是一個不同的問題。 – ANeves 2010-09-13 18:10:46

回答

29

好問題!在list of overloadable and non-overloadable operators中沒有列出這種或那種方式,在the operator's page上沒有提及。

所以我試過如下:

public class TestClass 
{ 
    public static TestClass operator ??(TestClass test1, TestClass test2) 
    { 
     return test1; 
    } 
} 

,我得到的錯誤「重載的二元運算符預期」。所以我想說的答案是,從.NET 3.5開始,一個不。

6

答案很簡單:沒有

C#設計原則不允許操作符重載的語言的這種變化語義。因此,諸如複合賦值,三元運算符和......之類的複雜運算符不能被重載。

14

根據ECMA-334標準,不可能重載?運營商。

同樣,你不能重載以下運算符:

  • =
  • & &
  • ||
  • 檢查
  • 選中
  • 的typeof
-2

如果有人在這裏尋找一個解決方案,最近的例子是這樣做

return instance.MyValue != null ? instance : new MyClass("Default"); 
+2

-1:你錯過了這一點,你已經可以用OP的代碼來做你的建議......也請仔細閱讀這個問題,他不是在問怎麼做,但如果有可能過載空合併運算符 - 不幸的是,這不是。 – ANeves 2010-09-13 18:08:23

2

據傳這是C#下一個版本的一部分。從http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated

7.單子空檢查

不再需要訪問屬性或方法之前檢查空值。在Groovy中被稱爲安全導航操作員)。

之前

if (points != null) { 
    var next = points.FirstOrDefault(); 
    if (next != null && next.X != null) return next.X; 
} 
return -1; 

var bestValue = points?.FirstOrDefault()?.X ?? -1;