Почему 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)
позволено. Что он должен вернуть?
"object"
, Но теперь результат отличается отnameof(System.Object)
и это не имеет смысла, учитывая, что класс один и тот же."Object"
в верхнем регистре, так же, какnameof(System.Object)
, Но теперь у нас есть странное исключение из правила:nameof()
возвращает точное строковое представление выражения, переданного как параметр... кромеobject
(и другой синоним). Это может вызвать тонкие проблемы, например, я мог бы точно сказать, чтоnameof(object)
возвращается"object"
посколькуnameof(Table)
возвращается"Table"
а такжеnameof(MyComponent.SomeProperty)
возвращается"SomeProperty"
, и так далее.
Изготовление nameof()
недоступный по синонимам однозначно разрешил неоднозначность.