If you use ILDasm, you can get a good analysis of the methods, go to View -> Meta Info -> select More Hex. Then go to the menu "View" - "Meta-info" → Show!
Here is a breakdown for the second method:
Method #2 (06000002)
-------------------------------------------------------
MethodName: GenericMethod (06000002)
Flags : [Public] [HideBySig] [ReuseSlot] (00000086)
RVA : 0x0000206c
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
hasThis
generic
Type Arity:1
ReturnType: String
2 Arguments
Argument #1: Var!0
Argument #2: MVar!!0
Signature : 30 01 02 0e 13 00 1e 00
1 Generic Parameters
(0) GenericParamToken : (2a000003) Name : N flags: 00000000 Owner: 06000002
2 Parameters
(1) ParamToken : (08000002) Name : anItem flags: [none] (00000000)
(2) ParamToken : (08000003) Name : secondItem flags: [none] (00000000)
If you scroll down the page, you will also see TypeSpec table entries.
TypeSpe # 1 (1b000001)
TypeSpec : MVar!!0
Signature: 1e 00
TypeSpe # 2 (1b000002)
TypeSpec : Var!0
Signature: 13 00
ILDasm, VAR (13 00) T, ( ), MVAR (1e 00) - N, ( ).
... , - TypeSpec IL. , - . ILdasm, :
.method public hidebysig instance void
'GenericMethod'<'N'>(!!'N' 'anItem') cil managed
{
.maxstack 1
.locals init ([0] string 's')
IL_0000: nop
IL_0001: ldarga.s 'anItem'
IL_0003: constrained. !!'N'
IL_0009: callvirt instance string ['mscorlib']'System'.'Object'::'ToString'()
IL_000e: stloc.0
IL_000f: ret
}
.method public hidebysig instance string
'GenericMethod'<'N'>(!'T' 'anItem',
!!'N' 'secondItem') cil managed
{
.maxstack 1
.locals init ([0] string 'CS$1$0000')
IL_0000: nop
IL_0001: ldarga.s 'anItem'
IL_0003: constrained. !'T'
IL_0009: callvirt instance string ['mscorlib']'System'.'Object'::'ToString'()
IL_000e: stloc.0
IL_000f: br.s IL_0011
IL_0011: ldloc.0
IL_0012: ret
}
0x1b - TypeSpec, , :
IL_0003: constrained. !!'N'
IL_0003: constrained. !'T'