2009-07-01 4 views
2

たとえば、C#でoutキーワードを使用するメソッドのパラメータは、アンパサンド&の前のメタデータシグネチャに表示されます。私はジェネリックメソッドのシグネチャを作成しようとしていますが、これを理解するためにメタデータAPIを使いたくないのですが、確かにどこかで文書化されていますか?ここで.NET 2.0/C#の汎用メソッドのメタデータのシグネチャ形式は何ですか?

は、私はSocketクラスにBeginReceiveFromのために何を意味するかの例です:

 System.IAsyncResult([]System.Byte,System.Int32,System.Int32, 
    System.Net.Sockets.SocketFlags,&System.Net.EndPoint, 
System.AsyncCallback,System.Object) 

答えて

4

引数の数が続くバッククォートがunconstructedタイプのため、あります、例えば

List`1 
Dictionary`2 

ECMA 335から、セクション10.7.2:

10.7.2タイプ名とアリティエンコード

CLS準拠ジェネリック型名はフォーマット 名を使用して符号化 あります[」 [...]は、墓のアクセントの文字"'" とアリティを一緒に使うと を示しています。 エンコードされた名前は、これらの規則に従わなければならない。

  1. 名は「`」 文字が含まれていないID(パーティションIIを参照)でなければなりません。
  2. アリティは、符号なしの10進数として、先行ゼロ またはスペースなしで指定されます。
  3. 通常のジェネリック型の場合、arityは、その型の と宣言された型パラメーターの数です。
  4. ネストされたジェネリック型の場合、arityは新しく導入された型の番号です。 パラメータ。

(私が原因値下げに、バッククォートは引用符で動作させることができなかったことに注意してください - それゆえアポストロフィを!)構築のタイプわからない

...

1

をするためにあなたは、一般的なパラメータを参照するために!!Tを使用する一般的な方法で宣言します。

.method public static void Method<T1, T2>(!!T1 arg1, !!T2 arg2) { 
    // ... 
} 

するか、あなたはそれらの番号を使用することができます。

.method public static void Method<T1, T2>(!!0 arg1, !!1 arg2) 

そして、汎用メソッドを呼び出すと、インスタンス化が提供されます。しかし、種類がWRTされているインスタンス化に言及方法と呼ばれる、ではないあなたがからそれを呼び出している場所:メソッドは、ジェネリック型の一部である

ldc.i4.1 
newobj instance void [mscorlib]System.Object::.ctor() 

// !!0 and !!1 refer to the generic parameters of Method<T1, T2>, 
// not any generic method this call instruction is part of 
call void Method<int32, object>(!!0,!!1) 

場合は、使用したタイプのインスタンスを指定します!Tも同様の方法で型パラメータを参照します。ジェネリック型には型名の後に汎用引数の数が続き、その後に汎用引数の数が続くという規則があることに注意してください。

call instance void MyGenericType`1<int32>::Method(!0) 
関連する問題