1

演算子のオーバーロードに関するこのMSDN ドキュメントを読みました。

その例では、使用された演算子は+であり、他の演算子または-を定義することもできます。*/

??次のような文字列に使用する演算子をオーバーロードしたい

string emptyString = emptyString ?? "OtherValue";

それ以外の

string emptyString = string.IsNullOrEmpty(emptyString) ? "OtherValue" : emptyString;

文字列をオブジェクトに変換して を使用して比較したくありません??

??MSDNが言うように、null許容値型に使用されることは知っています:

?? 演算子は null 合体演算子と呼ばれ、null 許容値型または参照型の既定値を定義するために使用されます。

オペランドが null でない場合は左側のオペランドを返します。それ以外の場合は、右側のオペランドを返します。

C# でこの演算子をオーバーロードできるかどうかお尋ねしたいと思います。上記の例は、 を使用する必要がある場合の簡単な状況??です。

4

3 に答える 3

7

いいえ、できません。

簡単な回避策は、拡張メソッドを使用することです。

 public static string IfNullOrEmpty(this string instance, string alt){
   return string.IsNullOrEmpty(instance) ? alt : instance;
 }

 var str1 = "".IfNullOrEmpty("foo"); //'foo'
 var str2 = ((string)null).IfNullOrEmpty("bar"); //'bar'
 var str3 = "Not null or empty".IfNullOrEmpty("not used"); //'not null or empty'

ただし、拡張メソッドがファーストクラスのコンパイル時定数に表示されるようにするには、その拡張メソッドを;""にマージする必要があることに注意してください。Systemすなわち:

 namespace System {
   public static class MyStringExtensions { 
     // method here
   }
 }

これをしないでください-ただし、キックのためだけです

お勧めはしませStringんが、暗黙のキャスト演算子を含むラッパー型を作成して、文字列が空の場合stringに返すこともできます。したがって、その型のインスタンスで演算子を使用すると、正しい動作が得られます。null??

    public class FakeString
    {
        private string _source;
        public FakeString(string source)
        {
        }

        public static implicit operator string(FakeString instance)
        {
            return string.IsNullOrEmpty(instance._source) ? null : instance._source;
        }

        public static implicit operator FakeString(string source)
        {
            return new FakeString(source);
        }
    }

    [TestMethod]
    public void Test()
    {
        FakeString fs = "";
        string result = (string)fs ?? "foo";

        Assert.AreEqual("foo", result);
    }

しかし、ご覧のとおり、キャストを使用して変換を開始する必要があり、実際にはかなり醜く恐ろしいので、そうしないでください。しかし、あなたはできます。 はしません。

これ以上免責事項が必要ですか?

その明示的なキャストに関するちょっとしたメモ

私の大部分はうまくいくはずだと思っていstring result = fs ?? foo;ましたが、うまくいきません。その理由は、nullによって実行されるチェックが??左側の参照に対してのみ行われるためです。null 許容値型の場合を除いて、型に依存しません。IL を逆コンパイルすると、参照がスタックに読み込まれ、それが true または false に評価されるかどうかがチェックされます。コードはその時点で、スタックに値を読み込む 2 つのさらなる操作のいずれかに分岐します (ここで、FakeString演算子その後、呼び出されます)。この動作は、null 許容値型の場合とは異なります。コンパイラはそれらを認識しているため、それに応じて動作を変更します。

于 2012-09-11T08:24:00.897 に答える
6

いいえ。こちらのOverloadable Operators C#をご覧ください。セクション「これらの演算子はオーバーロードできません。」

于 2012-09-11T08:20:54.767 に答える
2

これに伴い、オーバーロードできませんか?? オペレーター。

于 2012-09-11T08:21:33.240 に答える