43

C#でクラスのnull合体演算子をオーバーロードすることは可能ですか?

たとえば、インスタンスが null の場合はデフォルト値を返し、そうでない場合はインスタンスを返したいとします。コードは次のようになります。

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

しかし、null 合体演算子を使用して、MyClass.MyValue が設定されているかどうかも確認したい場合はどうすればよいでしょうか?

4

6 に答える 6

30

良い質問!オーバーロード可能およびオーバーロード不可能な演算子のリストに何らかの方法でリストされておらず、演算子のページには何も言及されていません。

だから私は次のことを試しました:

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

「オーバーロード可能な二項演算子が必要です」というエラーが表示されます。したがって、.NET 3.5 の時点では、答えはノーです。

于 2008-12-08T10:29:33.537 に答える
15

ECMA-334標準によれば、?? をオーバーロードすることはできません。オペレーター。

同様に、次の演算子をオーバーロードすることはできません。

  • =
  • &&
  • ||
  • ?:
  • ?.
  • チェック済み
  • 未チェック
  • 新着
  • タイプ
  • なので
于 2008-12-08T10:54:50.383 に答える
7

簡単な答え: いいえ

C# の設計原則では、言語のセマンティクスを変更する演算子のオーバーロードは許可されていません。したがって、複合代入、三項演算子、... などの複雑な演算子はオーバーロードできません。

于 2008-12-08T10:16:48.900 に答える
3

これは、C# の次のバージョンの一部であると噂されています。http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustratedより

7. モナドの null チェック

プロパティまたはメソッドにアクセスする前に null をチェックする必要がなくなります。Groovy では Safe Navigation Operator として知られています)。

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

var bestValue = points?.FirstOrDefault()?.X ?? -1;
于 2014-01-10T18:30:12.590 に答える
-3

誰かがここで解決策を探している場合、最も近い例はこれを行うことです

return instance.MyValue != null ? instance : new MyClass("Default");
于 2009-11-19T13:46:21.383 に答える