Ответ 1
Да. nameof()
оценивается во время компиляции. Посмотрев последнюю версию спецификации:
Имя выражения является константой. Во всех случаях имяof (...) оценивается во время компиляции для создания строки. Его аргумент не оценивается во время выполнения и считается недостижимым кодом (однако он не выводит предупреждение "недостижимый код" ).
Вы можете увидеть это с помощью этого примера TryRoslyn, где это:
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));
}
}
public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}