C#でクラスのnull合体演算子をオーバーロードすることは可能ですか?
たとえば、インスタンスが null の場合はデフォルト値を返し、そうでない場合はインスタンスを返したいとします。コードは次のようになります。
return instance ?? new MyClass("Default");
しかし、null 合体演算子を使用して、MyClass.MyValue が設定されているかどうかも確認したい場合はどうすればよいでしょうか?
C#でクラスのnull合体演算子をオーバーロードすることは可能ですか?
たとえば、インスタンスが null の場合はデフォルト値を返し、そうでない場合はインスタンスを返したいとします。コードは次のようになります。
return instance ?? new MyClass("Default");
しかし、null 合体演算子を使用して、MyClass.MyValue が設定されているかどうかも確認したい場合はどうすればよいでしょうか?
良い質問!オーバーロード可能およびオーバーロード不可能な演算子のリストに何らかの方法でリストされておらず、演算子のページには何も言及されていません。
だから私は次のことを試しました:
public class TestClass
{
public static TestClass operator ??(TestClass test1, TestClass test2)
{
return test1;
}
}
「オーバーロード可能な二項演算子が必要です」というエラーが表示されます。したがって、.NET 3.5 の時点では、答えはノーです。
ECMA-334標準によれば、?? をオーバーロードすることはできません。オペレーター。
同様に、次の演算子をオーバーロードすることはできません。
簡単な答え: いいえ
C# の設計原則では、言語のセマンティクスを変更する演算子のオーバーロードは許可されていません。したがって、複合代入、三項演算子、... などの複雑な演算子はオーバーロードできません。
これは、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;
誰かがここで解決策を探している場合、最も近い例はこれを行うことです
return instance.MyValue != null ? instance : new MyClass("Default");