gpt4 book ai didi

c# - `typeof` 运算符如何在泛型方法中获取类型参数?

转载 作者:太空狗 更新时间:2023-10-29 23:19:53 24 4
gpt4 key购买 nike

在 Java 中,这段代码不起作用:

public <T> void foo() { print(T.class); } // compile time error

因为泛型类型 T在运行时被删除。使用 T ,我必须将它用作参数,它将推送 String.class入栈

public <T> void foo(Class<T> T) { print(T); }
public void bar() { foo(String.class); }

但在 C# 中,我可以在运行时获取类型参数:

public void Foo<T>() { print(typeof(T)); }

它是如何工作的?编译器(或 vm)是否自动翻译 void Foo<T>()void Foo(Type T)


更新:

我反汇编了字节码,得到了类似的东西:

ldtoken    !!T
call System.Type System.Type::GetTypeFromHandle(System.RuntimeTypeHandle)

ldtoken是一条“将元数据 token 转换为其运行时表示”的指令,很明显 T 的运行时类型作为元数据存储。

我想每个方法都有自己的“元数据表”(或类似的东西),所以调用 Foo<string>()Foo<object>()会生成两个“方法句柄”和两个“元数据表”,但共享相同的机器码。是吗?

最佳答案

Does the compiler (or vm) automatically translate void Foo() to void Foo(Type T)?

不,它没有。泛型方法的主体是在运行时即时生成的。因此,例如,当您将 T 提供为 int 时,将生成此方法:

public void Foo<int>() { print(typeof(int)); }

每次传递不同类型时都会发生这种情况。但是,如果您再次使用相同的类型,CLR 将缓存先前生成的方法并执行它,而不是生成新的方法。

关于c# - `typeof` 运算符如何在泛型方法中获取类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54613727/

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