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

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

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

您可以在accepted answer中指定的official discussiondedicated post at my blog中阅读关于nameof()运算符的信息,您可以找到它的描述和使用示例。

是。 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");
    }
}
http://stackoverflow.com/questions/26573102/is-nameof-evaluated-at-compile-time

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 是否在编译时评估nameof()?