Почему nameof не работает над синонимами?

Из этого вопроса я узнал, что nameof() Оператор, введенный в C# 6.0, не работает по синонимам. Так что вы можете написать nameof(System.Object) но нет nameof(object),

Теперь есть 2 других аналогичных оператора, typeof() а также default()и они отлично работают по синонимам. Ты можешь написать:

default(object);
default(int);
typeof(string);
typeof(long);

так же как:

default(Object);
default(Int32);
typeof(String);
typeof(Int64);

и результаты одинаковы.

Я думаю, что было бы возможно построить nameof() оператор для работы с синонимами тоже.

Таким образом, вопрос: ПОЧЕМУ он не был реализован для работы с object, string, int, так далее.? Правильно ли мое предположение (т.е. это невозможно осуществить)? Или это был выбор дизайна?

1 ответ

Решение

Я думаю, что это выбор дизайна.

typeof() оператор возвращает Type, поскольку object а также System.Object выразить то же самое точно Typeнет проблем в письменной форме typeof(object),

То же самое относится и к default(): это null в обоих случаях (или 0 или что угодно).

Теперь для nameof(), контекст немного сложнее.

Притворись, что nameof(object) позволено. Что он должен вернуть?

  1. "object", Но теперь результат отличается от nameof(System.Object)и это не имеет смысла, учитывая, что класс один и тот же.
  2. "Object" в верхнем регистре, так же, как nameof(System.Object), Но теперь у нас есть странное исключение из правила: nameof() возвращает точное строковое представление выражения, переданного как параметр... кроме object (и другой синоним). Это может вызвать тонкие проблемы, например, я мог бы точно сказать, что nameof(object) возвращается "object" поскольку nameof(Table) возвращается "Table" а также nameof(MyComponent.SomeProperty) возвращается "SomeProperty", и так далее.

Изготовление nameof() недоступный по синонимам однозначно разрешил неоднозначность.

Другие вопросы по тегам