nameof не будет отражать использование

У меня есть псевдоним в моем файле исходного кода, например:

MyClass.cs

using System;               
using SomeClass = NewClass;
    
public class Program
{
    public static void Main()
    {
        Console.WriteLine(nameof(SomeClass));
    }
}
public class NewClass { }

Мне это нужно, потому что имена моих классов изменились, и теперь мне нужно одновременно скомпилировать как старую, так и новую структуру классов.

Когда я запускаю этот код, я получаю "SomeClass", но я ожидал "NewClass". Почему в этом случае nameof не отражает псевдоним, использующий директиву using?


person HimBromBeere    schedule 05.02.2021    source источник
comment
По замыслу ?   -  person Sinatr    schedule 05.02.2021
comment
Меня поражает, что это одна из тех ситуаций, когда вы не всегда можете получить то, что хотите, потому что многие люди ожидают, что это будет отражать SomeClass, как и NewClass.   -  person Damien_The_Unbeliever    schedule 05.02.2021
comment
@Sinatr Да, кажется, да. Спасибо за ссылку   -  person HimBromBeere    schedule 05.02.2021
comment
Обратите внимание, что string str1 = nameof(System) работает, поэтому nameof работает даже с такими вещами, как пространства имен, а using K = System; string str2 = nameof(K) вернет K.   -  person xanatos    schedule 05.02.2021
comment
@Damien_The_Unbeliever Возможно, ты прав. Я надеялся, что смогу избежать путаницы с именами в своем проекте миграции кода, используя nameof. Однако кажется, что вместо этого я вызываю их.   -  person HimBromBeere    schedule 05.02.2021
comment
Мне это нужно, потому что имена моих классов изменились, и теперь мне нужно одновременно скомпилировать как старую, так и новую структуру классов. Звучит точно так же, как вариант использования шаблона адаптера для меня. en.wikipedia.org/wiki/Adapter_pattern . Особенно, если бизнес-логика двух систем отличается. Хотя, возможно, я упускаю какой-то контекст ;)   -  person Dan Rayson    schedule 05.02.2021
comment
@DanRayson Нет, BL остается прежним, меняются только имена классов.   -  person HimBromBeere    schedule 05.02.2021


Ответы (2)


Это потому, что ключевое слово nameof предназначено для получения имени идентификатора без оценки его значения или чего-либо еще, как сказано в документах:

Выражение nameof оценивается во время компиляции и не действует во время выполнения.

Подробнее здесь

person LoRdPMN    schedule 05.02.2021
comment
Но поскольку это является константой времени компиляции, я ожидал, что using, которая также оценивается во время компиляции, будет отражена. - person HimBromBeere; 05.02.2021
comment
Да, можно ожидать, что он будет вести себя подобным образом, но, к сожалению, поскольку он разработан, он получает свое постоянное значение раньше всего во время компиляции. - person LoRdPMN; 05.02.2021

Ваш конкретный вопрос был, почему это не так? но вот что может сделать это вместо этого? ответ для вас :)

Используйте typeof вместо nameof.

using System;               
using SomeClass = NewClass;
    
public class Program
{
    public static void Main()
    {
        Console.WriteLine(typeof(SomeClass));
    }   
}

public class NewClass { }

отпечатки

NewClass
person Dan Rayson    schedule 05.02.2021
comment
Это не одно и то же, typeof медленнее, а использование более ограничено. - person Sinatr; 05.02.2021
comment
@Sinatr Вот почему он делает разные вещи o_0 Я думал, он делает то, что хотел? Я не понимаю к чему ваша критика? - person Dan Rayson; 05.02.2021
comment
Никакой критики, просто комментарий для тех, кто читает ответ. - person Sinatr; 05.02.2021
comment
Ооооо, теперь я понимаю xD Мне потребовалось время. - person Dan Rayson; 05.02.2021