ジェネリック 5 への接続
20.8 式とステートメント
一部の式とステートメントの演算がジェネリック用に変更されました。このセクションでは、これらの変更について説明します。
20.8.1 デフォルト値式
デフォルト値式は、型のデフォルト値を取得するために使用されます (§5.2)。通常、型パラメーターにはデフォルト値式が使用されます。これは、型パラメーターが値型または参照型の場合、それがまだ存在していない可能性があるためです。 (null型から型パラメータへの変換はありません。)
primary-no-array-creation-expression:(基本无数组创建表达式:) … default-value-expression(默认值表达式) default-value-expression:(默认值表达式:) primary-expression . default (基本表达式 .default) predefined-type . default(预定义类型. default)
デフォルト値式に基本式が使用されており、基本式を型に分割できない場合、コンパイル時にエラーが発生します。ただし、§7.5.4.1 で説明されている規則は、E.default を形成するコンポーネントにも適用されます。
デフォルト値式の左側が参照型に対して実行時に評価される場合、結果はその型に null 変換されます。デフォルト値式の左側が実行時に値型に対して評価される場合、結果は値型のデフォルト値になります (§4.1.2)。
型が参照型またはクラス制約のある型パラメータの場合、デフォルト値式は定数式 (§7.15) です。さらに、型が sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、10 進数、または bool のいずれかの場合、デフォルト値の式は定数式になります。
20.8.2 オブジェクト作成式
オブジェクトの共通式の型を型パラメータにすることができます。オブジェクト作成式の型として型パラメータを指定する場合、以下の2つの条件を満たさなければコンパイル時にエラーが発生します
実際のパラメータリストは削除する必要があります
new()形式のコンストラクタ型パラメーターに指定する必要があります 関数の制約
オブジェクト作成式は、型パラメーターがバインドされているランタイム型のインスタンスを作成し、その型の既定のコンストラクターを呼び出すことによって実行できます。ランタイム型は参照型または値型にすることができます。
20.8.3 演算子の種類
typeof 演算子は型パラメータに使用できます。結果は、type パラメーターにバインドされたランタイム型の System.Type オブジェクトです。 typeof 演算子を使用して型を構築することもできます。
class X <T> { public static void PrintTypes() { Console.WriteLine(typeof(T).FullName); Console.WriteLine(typeof(X<X<T>>).FullName); } } class M { static void Main() { X<int>.PrintTypes(); } }
前の手順では次のように出力されます。
System.Int32 X<X<Sytem.Int32>> Typeof运算符不能用于没有指定类型实参的泛型类型声明的名字。 class X<T>{…} class M { static void Main() { Type t = typeof(X); //错误,X需要类型实参 } }
20.8.4 参照型等価演算子
T がクラス制約によって制約されている場合、参照型等価演算子を使用して型パラメーター T の値を比較できます。
参照型等価演算子を使用すると、T にクラス制約がない場合でも、型パラメーター T の実パラメーターを null である他の実際のパラメーターと簡単に比較できます。実行時に、T が値型の場合、比較の結果は false になります。
次の例では、制約なしの型パラメーター型の実パラメーターが null かどうかを確認します。
class C<T> { void F(T x) { if(x==null) thow new ArgumentNullException(); … } }
T が値型を表すことができる場合でも、x==null 構造は許可され、T が値型の場合、その結果は単純に false として定義されます。
20.8.5 is运算符
在开放类型上的is运算符操作遵循通常的规则(§7.9.9)。如果e或T的编译时类型是一个开放类型,那么在运行时对于e和T将总是执行动态类型检查。
20.8.6as运算符
只要T有一个类约束,类型参数T可被用在as运算符的右边。这种限制是需要的,因为值null可能被作为运算符的结果返回。
class X { public T F<T>(object o) where T:Attribute { return o as T; //ok,T有一个类约束 } public T G<T>(object o) { return o as T; //错误,T没有约束 }
}
在as运算符(§7.9.10)的当前规范中,对于表达式e as T最后一点表明,如果从e的编译时类型到T,不存在有效的显式引用转换,将会出现编译时错误。对于泛型,这条规则稍微作了修改。如果E的编译时类型或T是一个开放类型,在这种情况下将不会出现编译时错误;相反,运行时检查将会执行。
20.8.7异常语句
对于开放类型,throw(§8.9.5)和try(§8.10)的通常规则是适用的。
只要类型参数具有System.Exeption异常(或子类具有)作为类约束,那么throw语句可以被用作其类型有一个类型参数给定的表达式。
只要类型参数System.Exception(或子类子类具有)作为类约束,那么在catch语句中的命名的类型可能是一个类型参数。
20.8.8 lock语句
lock语句可以被用作其类型由一个类型参数给定的表达式。如果表达式的运行时类型是一个值类型,lock将没有效果(因为对于装箱值不能有任何其他的引用)。
20.8.9 using 语句
using 语句(§8.13)遵循通常的规则:表达式必须被隐式的转换到System.IDisposable。如果类型参数通过System.IDisposable而约束,那么该类型的表达式可以使用using 语句。
20.8.10 foreach语句
给定如下形式的foreach语句
foreach(ElementType element in collection) statement
如果集合表达式是一个没有实现集合模式的类型,但为每个类型T实现了构造接口System.Collections.Generic.IEnumerable
IEnumerator<T> enumerator = ((IEnuemrable<T>)(collection).GetEnumerator(); try { where (enumerator.MoveNext()){ ElementType element = (ElementType)enumerator.Current; statement; } } finally{ enumerator.Dispose(); }
20.9查找规则修订
泛型修改了用于查找和绑定名字的某些基本规则。下面几节在考虑泛型的情况下,重新叙述了所有的基本名字查找规则。
20.9.1命名空间和类型名字
次のコンテンツは §3.8 を置き換えることができます。
C# プログラムには、名前空間または型名の指定を必要とするコンテキストがいくつかあります。どの形式の名前も、「.」マークで区切られた 1 つ以上の識別子で構成されます。
namespace-name: (名前空間名:)
namespace-or-type-name (名前空間または型名)
type-name: (型名:)
namespace-or-type-name (名前空間または型名) )
namespace-or-type-name: (名前空間または型名:)
識別子 type-argument-list opt (識別子の型引数リストはオプション)
namespace-or-type-name 識別子 type-argument-list opt (名前空間または型名。識別子の型引数リストはオプション)
名前空間名は、名前空間を参照する名前空間名または型名 (namespace-or-type-name) です。以下で説明する決定を参照してください。名前空間または名前空間名の型名は名前空間を参照する必要があります。参照しないとコンパイル時エラーが発生します。名前空間名に型引数を含めることはできません (型引数を持つことができるのは型のみです)。
型名は、型を参照する名前空間または型名です。以下で説明する決定を参照してください。型名の名前空間または型名は型を参照する必要があります。そうでない場合は、コンパイル時エラーが発生します。
名前空間または型名の意味は次のように決まります。
名前空間または型名が I または I
- 名前空間または型名がジェネリック メソッド宣言内にあり、その宣言に、型引数リストを指定しない I で指定された名前の型パラメーターが含まれている場合、名前空間または型名は型パラメーターを参照します。
- それ以外の場合、名前空間または型名が型宣言内にある場合は、型 T (
u I で指定された名前を含む型パラメーター T に宣言が指定されておらず、型引数リストがない場合、名前空間または型名はその型パラメーターを参照します。
u それ以外の場合、I が T のアクセス可能なメンバーの名前であり、そのメンバーが一致する数の型パラメーターを持つ型である場合、名前空間または型名は型 T.I または型 T.I
u I が N の名前空間内の名前で、型引数リストが指定されていない場合、名前空間または型名はその名前空間を参照します。
u それ以外の場合、I が一致する数の型引数を持つ N 内のアクセス可能な型の名前である場合、名前空間または型名は、指定された型引数で構築された型を参照します。
u それ以外の場合、名前空間または型名が N の名前空間宣言で囲まれた位置にある場合
- 名前空間宣言に I で指定された名前を持つ using エイリアス ディレクティブが含まれており、I がインポートされた名前空間または型を保持し、引数リストが指定されている場合、名前空間または型名はその名前空間または型を参照します
- それ以外の場合、名前空間宣言の using namespace ディレクティブによってインポートされた名前空間に、指定された名前、一致する型引数の型を持つ型が含まれている場合、この場合、名前空間または型名は、指定された型引数から構築された型を参照します。
- そうしないと、名前空間宣言の using namespace ディレクティブによってインポートされた名前空間に、型パラメーターの数と一致する指定された名前を持つ複数の型が含まれている場合、名前空間または型名があいまいになり、間違いが発生します。
- それ以外の場合、名前空間または型名が未定義となり、コンパイル時エラーが発生します。
l それ以外の場合、名前空間または型名は N.I または N.I
- N が名前空間を参照し、I が N に埋め込まれた名前空間名で、型引数リストが指定されていない場合、名前空間または型名は埋め込まれた名前空間を参照します。
- それ以外の場合、N が名前空間を参照し、I が一致する数の型引数を使用して N でアクセス可能な型の名前である場合、名前空間または型名は、指定された型引数から構築された型を参照します。
- それ以外の場合、N がクラスまたは構造体の型を指し、I が一致する型パラメーターを持つ N に埋め込まれたアクセス可能な型の名前である場合、名前空間または型名は、指定された引数で構築された型を指します。
- それ以外の場合、N.I は無効な名前空間名であり、コンパイル時エラーが発生します。
20.9.2 メンバー検索
以下の内容は置き換え可能です§7.3
メンバー検索はコンテキストでの意味に基づいて型を決定するプロセスです。式内では、メンバーの検索は、単純な名前評価として、またはメンバー アクセスとして実行できます (§20.9.4)。
タイプ T の名前 N のメンバー検索は、次の規則に従って決定されます。
まず、N という名前のアクセス可能なメンバーのセットが決定されます。
- T が型パラメーターの場合、 T のクラス制約またはインターフェイス制約として指定された各型で、 object 内の N の名前付きメンバーのセットとともに、このセットは名前付きのアクセス可能なメンバーの和集合になります。
- それ以外の場合、このセットは、オブジェクトの N の継承されたメンバーと名前付きのアクセス可能なメンバーを含む、T の N のすべての名前付きアクセス可能なメンバーで構成されます。 T が構築型の場合、§20.5.4 で説明されているように型引数を置換することによってメンバーのセットが取得されます。 override 修飾子を含むメンバーはコレクションから除外されます。
その後、他のメンバーを通して隠されているメンバーはこのセットから削除されます。セット内の各メンバー S.M について、S は M が宣言されている型であり、次のルールが適用されます
- M が定数、フィールド、プロパティ、イベント、または列挙メンバーの場合、S のすべての基底で宣言されたすべてのメンバークラスはこのコレクションから削除されます。
- M が型宣言の場合、S の基本クラス内のすべての非型宣言はセットから削除され、基本型で宣言された S と同じ数の型パラメーターを持つ M のすべての型宣言は、コレクションから削除されます。
- M がメソッドの場合、S の基本クラスで宣言されたメソッド以外のメンバーはすべてこのセットから削除され、S の基本型で宣言された M と同じシグネチャを持つすべてのメソッドがこのコレクションから削除されます。 。
その後、クラスメンバーを通して隠されたインターフェースメンバーがコレクションから削除されます。このステップは、T が型パラメーターであり、T にクラス制約と複数のインターフェース制約がある場合にのみ有効です。コレクション内の各メンバー S.M について、S は M が宣言されている型であり、S がオブジェクトではなくクラス宣言である場合、次のルールが適用されます
- M が定数、フィールド、プロパティ、イベント、列挙型の場合メンバーまたは型宣言を行うと、インターフェイス宣言で宣言されたすべてのメンバーがこのセットから削除されます。
- M がメソッドの場合、インターフェイス型で宣言されたメソッド以外のメンバーはすべてこのセットから削除され、インターフェイスで S として宣言された M の同じシグネチャを持つすべてのメソッドがこのセットから削除されます。
最後に、非表示のメンバーを削除した後、検索の結果が決定されます
- コレクションが型やメソッドではなく単一のメンバーで構成されている場合、このメンバーが検索の結果になります。
- それ以外の場合、セットにメソッドのみが含まれている場合、このメソッドのセットが検索の結果になります。
- それ以外の場合、セットに型宣言のみが含まれている場合、この型宣言のセットはメンバー検索の結果に含まれます。
- そうしないと、ルックアップがあいまいになり、コンパイル時エラーが発生します。
型の場合、インターフェイスの型パラメーターやメンバー検索ではなく、インターフェイス内のメンバー検索は厳密に単一継承であり (継承チェーン内の各インターフェイスには、正確に 0 または 1 つの直接ベース インターフェイスがあります)、検索ルールの効果は派生メンバーのみです。同じ名前と署名を持つ基本クラスのメンバーを非表示にします。この単一継承の検索は非常に明示的です。メンバー検索での曖昧さの可能性は、§13.2.5
20.9.3 単純名
で説明されている多重継承インターフェイスから生じます。次のコンテンツは §7.5.2 を置き換えることができます。
単純な名前は、識別子と、それに続くオプションの型パラメーターのリストで構成されます。
simple-name: (単純名:)
identifier type-argument-list opt (識別子の型引数リストはオプション)
I または I
単純名がブロック内に出現し、ブロックのローカル変数宣言スペースに I で指定された名前のローカル変数またはパラメーターが含まれている場合、その単純名はローカル変数またはパラメーターを参照し、変数として分類されます。型引数リストを指定した場合、コンパイル時にエラーが発生します。
単純名がジェネリック メソッド宣言の本文内にあり、その宣言に I で指定された名前の型パラメーターが含まれている場合、単純名はその型パラメーターを参照し、型引数リストのみが指定されている場合は、コンパイル時エラー。
それ以外の場合は、直接囲んでいるクラス、構造体、または列挙型によって宣言されたインスタンス型で始まる型 T の各インスタンスについて、外側の各クラスや構造体によって宣言されているインスタンス型 (存在する場合) を続行します。
- T の宣言に I で指定された型パラメーターが含まれている場合、単純名はその型パラメーターを参照します。型引数リストを指定した場合、コンパイル時にエラーが発生します。
- それ以外の場合、T 内の I のメンバー検索で一致が生成される場合
u T が直接囲んでいるクラスまたは構造体型のインスタンス型であり、検索で 1 つ以上のメソッドが識別される場合、結果は式との一致になります。このメソッド グループに関連付けられています。型引数リストが指定されている場合、それはジェネリック メソッド呼び出しで使用されます (§20.6.3)。
u T が直接囲んでいるクラスまたは構造体型のインスタンス型である場合、ルックアップでインスタンス メンバーが特定され、参照がインスタンス コンストラクター、インスタンス メソッド、またはインスタンス アクセサーのブロック内で発生する場合、結果は同じになります。このように。I メンバーのアクセス形式も同様です。 type 引数を指定した場合、コンパイル時にエラーが発生します。
u それ以外の場合、結果は T.I または T.I
それ以外の場合、単純な名前が表示される各名前空間を持つ名前空間 N について、エンティティが見つかるまで、各囲みの名前空間 (存在する場合) を続行し、グローバル名前空間で終了するまで、次のステップが評価されます。
- I が N の名前空間の名前で、型引数リストが指定されていない場合、単純名はその名前空間を参照します。
- それ以外の場合、I が、一致する数の型引数を持つ N 内のアクセス可能な型の名前である場合、単純型は、指定された型引数から構築された型を参照します。
u 名前空間宣言に、I で指定された名前に関連付けられた using エイリアス ディレクティブが含まれている場合 (I はインポートされた名前空間または型で、型引数リストが指定されていない場合)、単純名は名前空間または型を参照します。
u それ以外の場合、名前空間宣言の using namespace ディレクティブによってインポートされた名前空間に、型引数の数と一致する I で指定された型が含まれている場合、単純名は指定された型引数から構築された型を参照します。
u それ以外の場合、名前空間宣言の using namespace ディレクティブによってインポートされた名前空間に、型パラメーターの数と一致する I で指定された名前を持つ複数の型が含まれている場合、単純な名前があいまいになり、コンパイル時エラーが発生します
lそれ以外の場合、単純名で指定された名前は未定義となり、コンパイル時エラーが発生します。
20.9.4メンバーアクセス
次のコンテンツは §7.5.4 を置き換えることができます。
メンバー アクセスは、基本的な式または事前定義された型、その後に「.」マーク、識別子、および型引数のオプションのリストで構成されます。
member-access: (メンバーアクセス:)
primary-expression . identifier type-argument-list opt (基本式。識別子の型引数リストはオプション)
predefine-type . identifier type-argument-list opt (事前定義済み)タイプを定義します。識別子のタイプ引数リストはオプションです) 事前定義されたタイプ: 次のいずれか
bool byte char 10進数 double float int long
object short string uint ulong ushort
E.I または E.I
E が名前空間、I が E 内のネストされた名前空間の名前で、型引数が指定されていない場合、結果はこの名前空間になります。
E が名前空間、I が E でアクセス可能な型の名前、そして E が型パラメーターの数と一致する場合、結果は指定された型引数から構築された型になります。
E が事前定義された型または型として分類されるプリミティブ式の場合、E が型パラメーターではない場合、および E 内の I のメンバー検索で一致が得られた場合、E.I は次のように評価され、分類されます。
- 1 つ以上の型宣言を識別した場合、その型宣言は、型引数で指定されたものと同じ数 (おそらくゼロ) の型引数を使用して決定されます。結果は、指定された型引数から構築された型です。型宣言が型パラメータの数と一致しない場合、コンパイル時エラーが発生します。
- 1 つ以上のメソッドを特定した場合、結果は関連付けられたインスタンス式のないメソッド グループになります。型引数リストが指定されている場合、それはジェネリック メソッド呼び出しで使用されます (§20.6.3)。
- 静的プロパティ、静的フィールド、静的イベント、定数、または列挙型メンバーを識別した場合、型引数リストが指定されているとコンパイル時エラーが発生します。
- 静的プロパティを識別した場合、結果は関連付けられていないインスタンス式を使用したプロパティ アクセスになります。
- 静的フィールドを識別した場合
u フィールドが読み取り専用で、参照がクラスまたは構造体の静的コンストラクターの外側で発生する場合、フィールドはここで宣言されます。結果は値、つまり E の静的フィールド I の値になります。
u それ以外の場合、結果は変数、つまり E の静的フィールド I になります。
- I が静的イベントを識別した場合
u イベントが宣言されているクラスまたは構造体で参照が発生し、イベントがイベント アクセサー宣言 (§10.7) なしで宣言されている場合、E.I は I と同じように扱われます。静的なフィールドのようなものです。
u それ以外の場合、結果は関連付けられていないインスタンス式へのイベント アクセスになります。
- 定数を識別した場合、結果は値、つまり定数の値になります。
- 列挙型メンバーを識別した場合、結果は値、つまり列挙型メンバーの値になります。
- それ以外の場合、E.I は無効なメンバー参照であり、コンパイル時エラーが発生します。
E が T 型のプロパティ アクセス、インデクサー アクセス、変数、または値であり、T 内の I のメンバー検索で一致が生成される場合、E.I は次のように計算され、分類されます。
- まず、E がプロパティまたはインデクサー アクセスの場合、プロパティまたはインデクサー アクセスの値が取得され (§7.1.1)、E は値として再分類されます。
- 1 つ以上のメソッドを識別すると、結果は E のインスタンス式が関連付けられたメソッド グループになります。型引数リストが指定されている場合、それはジェネリック メソッド呼び出しで使用されます (§20.6.3)。
- インスタンス プロパティ、インスタンス フィールド、またはインスタンス イベントを識別した場合、型引数リストが指定されているとコンパイル時エラーが生成されます。
- インスタンス プロパティを識別すると、結果は関連付けられた E を持つインスタンス式になります。
- T がクラス型で、I がクラス型のインスタンス フィールドを識別する場合
u E の値が null の場合、System.NullReferenceException がスローされます。
u それ以外の場合、フィールドが読み取り専用で、そのフィールドが宣言されているクラスのインスタンス コンストラクターの外側で参照が行われる場合、結果は値になります。これは、E によって参照されるオブジェクト内の I の値です。
u それ以外の場合、結果は変数になります。これは、E によって参照されるオブジェクト内のフィールド I です。
- T が構造体型で、I がその構造体型のインスタンス フィールドを識別する場合
u E が値の場合、またはフィールドが読み取り専用で、フィールドが含まれる構造体のインスタンス コンストラクターの外部で参照が発生する場合宣言された場合、結果は値になります。これは、E によって与えられる構造体インスタンスのフィールド I の値です。
u それ以外の場合、結果は変数、つまり E で指定された構造体のインスタンス内のフィールド I になります。
- I がインスタンス イベントを識別した場合
u 参照がイベントが存在するクラスまたは構造体内で発生した場合宣言されており、イベントがイベント アクセサー宣言なしで宣言されている場合、E.I はインスタンス フィールドであるかのように扱われます。
u それ以外の場合、結果は E が関連付けられたインスタンス式になります。
それ以外の場合、E.I は無効なメンバー参照であり、コンパイル時エラーが発生します。
20.9.5 メソッド呼び出し
以下の内容は、§7.5.5.1 のメソッド呼び出しを説明するコンパイル時処理部分を置き換えることができます。
M(A) の形式でのメソッド呼び出しのコンパイル時処理。M はメソッド グループ (型引数リストが含まれる場合がある)、A はオプションの引数リストであり、次の手順で構成されます。
メソッド呼び出しの候補セットが構築されます。メソッド グループ M に関連付けられた各メソッド F
- F が非ジェネリックの場合、
u M に型引数リストがなく、
u が A (§7.4.2.1) の場合、F は候補になります。F は適用可能です。
- F がジェネリックで、M に型引数リストがない場合、型引数のリストを推論する呼び出しの場合、
u 型推論が成功したとき (§20.6.4)、F は候補となり、
u 推論された型が完了すると引数は、対応するメソッドの型パラメータを置き換えます。F のパラメータ リストは A に適用でき、
u 型引数を置き換えた後、F のパラメータ リストは、該当する場合、その拡張形式になる可能性があります (§7.4. 2.1)。同じ型で F として宣言されたジェネリック メソッドは異なります。
- F がジェネリックであり、M に型引数リストが含まれる場合、
u F が型引数リストで提供されているのと同じ数のメソッド型パラメーターを持ち、かつ
u F のパラメーター リストが次の場合に F が候補になります。型引数が対応するメソッドの型パラメータに置き換えられると (§7.4.2.1)。
候補メソッドのセットは、深く派生した型から派生したメソッドのみを含むように削減されます。セット内のすべての C.F メソッドについて、C は F が宣言されている型であり、C の基本型で宣言されているすべてのメソッドは削除されます。コレクションから。
候補メソッドの結果セットが空の場合、該当するメソッドは存在せず、コンパイル時エラーが発生します。候補メソッドが同じ型で宣言されていない場合、メソッド呼び出しがあいまいになり、コンパイル時エラーが発生します (後者のケースは、複数の直接ベース インターフェイスを持つインターフェイス内のメソッドでのみ発生します)。 §13.2.5)。
一連の候補メソッドのうち最適なメソッドは、オーバーロード決定ルール (§7.4.2) を使用して特定されます。最適なメソッドを 1 つだけ特定できない場合、メソッド呼び出しがあいまいになり、コンパイル時エラーが生成されます。オーバーロードの解決を実行するとき、ジェネリック メソッドのパラメーターは、対応するメソッドの型パラメーターを型引数 (提供または推論) に置き換えた後に考慮されます。
選択された最良のメソッドの最終検証が実行されます
- メソッドはメソッド グループのコンテキストで有効です。メソッドが静的メソッドの場合、単純な名前またはメンバーから派生した型を介してメソッド グループにアクセスする必要があります。最適なメソッドがインスタンス メソッドである場合、メソッド グループは、変数、値、または単純な名前またはメンバー アクセスから派生したベース アクセスを通じてアクセスできる必要があります。これらの要件がいずれも満たされていない場合、コンパイル時エラーが発生します。
- 最適なメソッドがジェネリック メソッドの場合、型引数 (提供または推論) がジェネリック メソッドで宣言された制約と照合されます。いずれかの型引数が対応する型パラメーターの制約を満たさない場合、コンパイル時エラーが生成されます。
前の手順に従ってメソッドが選択され検証されると、実際の実行時呼び出しは §7.4 の関数メンバー呼び出し規則に従って処理されます。
20.9.6 デリゲート作成式
次のコンテンツは、§7.5.10.3 のデリゲート作成式のコンパイル時処理部分を置き換えることができます。
new D(E) の形式でのデリゲート作成式のコンパイル時処理 (D はデリゲート型、E は式) は、次の手順で構成されます。
E が E(A) 形式のメソッド呼び出しに対応するメソッド グループ
の場合、単一のメソッド呼び出しが選択されます。
u D のパラメータの型と修飾子 (ref または out) は、引数リスト A の引数の型と修飾子として使用されます。
u 変換は、該当する場合、テストおよび型推論では考慮されません。暗黙的な変換で十分な場合、型の要件は同じです。
u オーバーロード判定ステップは実行されません。代わりに、候補のセットには D 互換メソッドが 1 つだけ含まれている必要があり (その場合、型パラメーターの代わりに型引数を使用します)、このメソッドが新しく作成されたデリゲートによって参照されるメソッドになります。一致するメソッドが存在しない場合、または一致するメソッドが複数存在する場合は、コンパイル時エラーが発生します。
- 選択したメソッドがインスタンス メソッドの場合、E に関連付けられたインスタンス式によってデリゲートのターゲット オブジェクトが決定されます。
- 結果はタイプ D の値で、選択したメソッドとターゲット オブジェクトの新しく作成されたデリゲートを参照します。
それ以外の場合、E はデリゲート型の値です
- D と E は互換性がある必要があり、そうでない場合はコンパイル時エラーが発生します。
- 結果はタイプ D の値、つまり E と同じ呼び出しリストを参照する新しく作成されたデリゲートです。
それ以外の場合、デリゲート作成式は無効であり、コンパイル時エラーが発生します。
20.10 右シフト構文の変更
ジェネリックでは、型パラメーターと型引数を区切るために「<」および「>」文字が使用されます (C++ のテンプレート構文と同様)。 List
これらの中立的な構造の語彙の単純さを保つために、「>>」および「>>=」マーカーが語彙集から削除され、右シフトおよび右シフト代入生成に置き換えられました。
演算子または句読点: ;
+ - * / % > < > = <= >= += -= *= /= %= &= |=
^= << <<=
右シフト: (右シフト:)
> -shift-assignment: (右シフト代入)
> >=
構文内の他のプロダクションとは異なり、右シフト代入プロダクションのトークンの間にはいかなる種類の文字も使用できません (空間)。
以下のプロダクションは、右シフトまたは右シフト代入を使用して変更されています。
shift-expression: (shift 式:)
additive-expression (追加の式)
shift-expression <
代入演算子: (代入演算子:)
=
+=
-=
*=
/=
%=
&=
| =
^=
<<=
right-shift-assignment
overloadable-binary-operator: (オーバーロード可能な二項演算子:)
+
-
*
/
%
&
|
^
<<
right-shift
==
!=
>
<
>=
<=
(一般終了)
**************** ************** ****
上記は C# 2.0 仕様 (Generics 6) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (m.sbmmt.com) に注目してください。