gpt4 book ai didi

c# - nameof() 是否在编译时评估?

转载 作者:IT王子 更新时间:2023-10-29 03:34:36 26 4
gpt4 key购买 nike

在 C# 6 中,您可以使用 nameof()运算符获取包含变量或类型名称的字符串。

这是在编译时评估还是在运行时通过某些 Roslyn API 评估?

最佳答案

是的。 nameof() 在编译时计算。查看最新版本的规范:

The nameof expression is a constant. In all cases, nameof(...) is evaluated at compile-time to produce a string. Its argument is not evaluated at runtime, and is considered unreachable code (however it does not emit an "unreachable code" warning).

来自 nameof operator - v5

你可以用 this TryRoslyn example 看到这是:

public class Foo
{
public void Bar()
{
Console.WriteLine(nameof(Foo));
}
}

编译反编译成这样:

public class Foo
{
public void Bar()
{
Console.WriteLine("Foo");
}
}

它的运行时等价物是:

public class Foo
{
public void Bar()
{
Console.WriteLine(typeof(Foo).Name);
}
}

如评论中所述,这意味着当您在泛型类型的类型参数上使用 nameof 时,不要期望获得用作类型参数的实际动态类型的名称而不仅仅是类型参数的名称。所以这个:

public class Foo
{
public void Bar<T>()
{
Console.WriteLine(nameof(T));
}
}

Will become这个:

public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}

关于c# - nameof() 是否在编译时评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26573102/

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