gpt4 book ai didi

c# - 为什么通用类型在 CIL 中的函数定义处看起来像 (!!T)

转载 作者:行者123 更新时间:2023-11-30 14:27:23 26 4
gpt4 key购买 nike

为什么在 CIL 中泛型在函数定义处看起来像 (!!T) 而在调用者处看起来像 (!!0)。在某些情况下,泛型类型的参数看起来像 (!0)。背后的 secret 是什么?或者为什么要这样设计?

提前谢谢你。

C#代码如下:

    private static void Main(string[] args)
{
Test<int>();
TestList<int>(new List<int>{ 1, 2,3 }, 1, 2, 3, 4, 5, 6, 7,8);
Console.ReadKey();
}

private static void TestList<T>(List<T> list, T item, T t2, T t3, T t4, T t5, T t6, T t7, int t8)
{
Console.WriteLine(item == null);
Console.WriteLine("Collection contains {0}? {1}", item, list.Contains(item));
}

以及调用TestList的CIL代码:

IL_002e:  call       void BoxingAndUnboxing.Program::TestList<int32>(class        [mscorlib]System.Collections.Generic.List`1<!!0>,
!!0,
!!0,
!!0,
!!0,
!!0,
!!0,
!!0,
int32)

以及函数定义的CIL代码:

.method private hidebysig static void  TestList<T>(class [mscorlib]System.Collections.Generic.List`1<!!T> list,
!!T item,
!!T t2,
!!T t3,
!!T t4,
!!T t5,
!!T t6,
!!T t7,
int32 t8) cil managed

以及将类型显示为 !0 而不是 !!0 的 CIL 代码

 IL_001d:  callvirt   instance bool class [mscorlib]System.Collections.Generic.List`1<!!T>::Contains(!0)

最佳答案

!0表示包含类的第一个泛型参数。
!!0表示方法本身的第一个泛型参数。

class C<X> { void M<Y>(X a, Y b) {} }中的方法将被称为 C`1::M`1(!0, !!0) . !0X , 和 !!0Y .

最后,!!0 , 在引用方法时使用,表示方法声明的第一个参数,而 !!T ,在实际实现中,表示当前方法的类型参数,名称为T .

!!0在方法引用中有必要区分 M<X, Y>(X x, Y y)M<X, Y>(Y y, X x) , 变成 M`2(!!0, !!1)M`2(!!1, !!0) .

关于c# - 为什么通用类型在 CIL 中的函数定义处看起来像 (!!T),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32982775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com