Почему это выражение работает? (C# 6.0)

nameof(ServiceResult<object>.Result), где ServiceResult<object> мой пользовательский тип и Result это поле этого типа. ServiceResult<object> это просто объявление типа, у него нет оператора new и (), но на официальной странице MS написано nameof принимает переменную и ее члены. Почему это выражение работает? Я не видел таких заявлений раньше.

1 ответ

Решение

Спецификация, которую вы упомянули, вероятно, старая, C# 6.0 nameof Справочник оператора:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/nameof

Аргумент к nameof должно быть простым именем, квалифицированным именем, доступом к члену, базовым доступом с указанным участником или доступом с указанным участником. Выражение аргумента идентифицирует определение кода, но оно никогда не оценивается.

В вашем случае это выражение. Похожий на

nameof(C.Method2) -> "Method2"

из списка примеров в этой статье.

Примеры

using Stuff = Some.Cool.Functionality  
class C {  
    static int Method1 (string x, int y) {}  
    static int Method1 (string x, string y) {}  
    int Method2 (int z) {}  
    string f<T>() => nameof(T);  
}  

var c = new C()  

nameof(C) -> "C"  
nameof(C.Method1) -> "Method1"   
nameof(C.Method2) -> "Method2"  
nameof(c.Method1) -> "Method1"   
nameof(c.Method2) -> "Method2"  
nameof(z) -> "z" // inside of Method2 ok, inside Method1 is a compiler error  
nameof(Stuff) = "Stuff"  
nameof(T) -> "T" // works inside of method but not in attributes on the method  
nameof(f) -> "f"  
nameof(f<T>) -> syntax error  
nameof(f<>) -> syntax error  
nameof(Method2()) -> error "This expression does not have a name"
Другие вопросы по тегам