4

1 時間前、私は質問をしました: 驚くべきことに、拡張メソッドを作成するにはどうすればよいEnum?-Nullable<Enum>です か?
Enum

クール、それは動作しますが、どのように?

私が正しく理解していれば、すべての列挙型はから派生しEnumているため、私が持っているすべての列挙型でこの拡張メソッドを使用できるのはこのためです。

しかし...ItemType?たとえば、列挙型は列挙型ではなく、Nullable<ItemType>それは、から派生しItemTypeないものEnumです。
同様にList<DataReader>、から派生していないため、メソッドをDataReader使用できませんが、ジェネリック型です。DataReaderDataReader

このNullable<T>型には多くの「ブードゥー教」とシンタックス シュガーが含まれていますが、これはその 1 つですか?

4

3 に答える 3

5

拡張メソッドは、クラスが /derived/ である必要はなく、存在するために変換が必要なだけです (より具体的には、暗黙の ID、参照、またはボックス変換。これは §7.6.5.2「拡張メソッドの呼び出し」です)。

からNullable<ItemType>への変換System.Enumはボクシング変換です。Nullable<int>からへの変換と同じSystem.Objectです。

また、独自の構造を定義した場合は、 からへstruct Test : IMyInterface {}の変換が行われます。Nullable<Test>IMyInterface

nullable からのボクシング変換は、nullable が null の場合、null 参照を返します。それ以外の場合は、nullable の値をボックス化します。詳細については、C# 仕様の §6.1.7「Boxing conversions」を参照してください。

于 2012-10-18T17:00:39.813 に答える
2

これは、コンパイラの魔法というよりも型システムの魔法です。は参照型であるためEnum、渡す値はすべてボックス化されます (たとえば、参照に変換されます)。

null 値または内部型 ( )のボックス化された値を表すがボックス化された値を表す場合は、ボックス化によってNullable<T>ウィザーが生成されるという特別な処理が CLR に追加されました。もちろん、逆もまた真です。null 許容型へのボックス化解除は、参照を受け入れます。nullTNullable<T>null

于 2012-10-18T17:05:43.097 に答える
1

拡張メソッドは、最初の引数がメソッドが呼び出された変数である静的メソッドに変換されます。

Enum の例では、Enum はクラス (構造体ではない) であるため、拡張メソッドは列挙型の具体的な値 (通常は int に煮詰められる) または null のいずれかを受け入れることができます。したがって、null 許容列挙型で機能します。

それと同じことがintでは機能しないでしょうか?(ヌル可能)。int の拡張メソッドを作成すると、Nullable でそれを呼び出すことができなくなります (「インスタンスの引数の型 Nullable を int に変換できません」と表示されます)。

于 2012-10-18T16:56:27.757 に答える