4

.NET フレームワークの null 許容型は、フレームワークが提供する優れた構造に過ぎず、言語自体に新たに追加されたものではないと常に考えていました。

つまり、今日まで、デモンストレーションの目的で、独自の Nullable 構造体を作成しようとしました。

これを行う機能を除いて、必要なものはすべて入手できます。

var myInt = new Nullable<int>(1);
myInt = 1;

問題は 2 番目のステートメントです。代入演算子をオーバーロードすることは決してできないためです。

私の質問は、代入演算子がオーバーロードを持つ言語の特殊なケースですか? そうでない場合、前の例を機能させるためにどのようにアプローチしますか?

ありがとう!

4

4 に答える 4

10

割り当ては、次のように宣言された暗黙の演算子を使用して処理されます。

public static implicit operator Nullable<T> (T value)

これは、言語固有の機能なしで処理されます。

null 許容サポートのための言語への主な変更点は、これを次のように記述できるようになったことです。

 int? myInt = 1;

これを次の方法でタイプに実装できます。

public static implicit operator Nullable<T> (T value)
{
    return new Nullable<T>(value);
}

Nullable<T>悲しいことに、C# 言語と CLR に関連する多くの機能があり、コードで複製することはできません

于 2012-05-04T20:16:19.623 に答える
5

他の答えについても同じですが、それもいくつかの魔法Nullable<T>を行うことに注意してください。

Lippertによるその回答からの引用

C# は、演算子を自動的に nullable に持ち上げます。「自動的にオペレーターを MyNullable に持ち上げる」と言う方法はありません。ただし、独自のユーザー定義演算子を作成することで、かなり近づけることができます。

C# には、null リテラルに関する特別なルールがあります。それらを null 許容変数に割り当てて、それらを null 許容値と比較すると、コンパイラがそれらの特別なコードを生成します。

nullable のボクシング セマンティクスは非常に奇妙で、ランタイムに組み込まれています。それらをエミュレートする方法はありません。

is、as、合体演算子の Null 許容セマンティクスが言語に組み込まれています。

Nullable は構造体の制約を満たしていません。それをエミュレートする方法はありません。

等々。

于 2012-05-04T20:20:35.630 に答える
3

代入演算子はオーバーロードされていませんが、クラスNullable<T>は に変換できる暗黙の変換演算子を指定しTていNullable<T>ます。

この機能をクラスに簡単に追加できます。

class MyInteger {
  private int value;

  public MyInteger(int value) { this.value = value; }

  public static implicit operator MyInteger(int value) {
    return new MyInteger(value);
  }
}

そして、同じ方法で演算子を使用します。

MyInteger obj = 123;
于 2012-05-04T20:15:54.247 に答える
1

このページによると演算子のオーバーロード

代入演算子自体 (=) はオーバーロードできないことに注意してください。

暗黙の演算子を定義できます

于 2012-05-04T20:16:17.460 に答える