Pytanie nameof z typami ogólnymi


Próbuję uzyskać nazwę metody na ogólny interfejs. Spodziewam się, że to zadziała, ponieważ część typu byłaby poprawnym typem:

//This does not compile
nameof(IGenericInterface<>.Method)

//This would compile
typeof(IGenericInterface<>)

Myślę, że to powinno być poprawne C # 6 lub czy czegoś brakuje lub czy jest to lepszy sposób na zrobienie tego. Nie chcę używać ciągu znaków dla nazwy metody, tak jak gdyby zmieniono nazwę metody, kod zostałby złamany bez błędów czasu kompilacji.


14
2017-10-14 16:03


pochodzenie


gdyby nameof(IGenericInterface<>) działa wtedy spróbuj $"{nameof(IGenericInterface<>)}.{nameof(Method)}" - M.kazem Akhgary
nie przyniosłoby takiego samego wyniku jak nazwa (IGenericInterface <>. Method) powinno zwrócić metodę - Jake Rote
na przykład - Jonesopolis


Odpowiedzi:


To jest oczekiwane. Według dokumentacja, twoje wyrażenie jest niedozwolone, ponieważ odnosi się do niezwiązanego rodzaju ogólnego:

Ponieważ argument musi być wyrażeniem składniowym, istnieje wiele rzeczy niedozwolonych, które nie są przydatne do listy. Warto wspomnieć o błędach produkcyjnych: predefiniowanych typach (na przykład int lub void), typy nullable (Point?), typy tablic (Customer[,]), typy wskaźników (Buffer*), kwalifikowany alias (A::B) i niezwiązane typy ogólne (Dictionary<,>), symbole przetwarzania wstępnego (DEBUG) i etykiety (loop:).

Możesz obejść to ograniczenie, podając ogólny parametr:

nameof(IGenericInterface<object>.Method)

Uwaga: Myślę, że Microsoft powinien poprawić nameof funkcja umożliwiająca odwoływanie się do metod niezwiązanych rodzajów generycznych.


21
2017-10-14 16:10



Dziwne, że tak się spodziewamy, i tak, zgadzam się, że powinni pozwolić, jak by się posunąć, aby je podnieść. - Jake Rote
Pod maską, generics są zasadniczo rozszerzone na wszystkie typy, z którymi są używane, prawda? Jest to prawdopodobnie mało istotny problem, ale użycie nameof(IGenericInterface<object>) w kodzie wygeneruje następnie interfejs IGenericInterface<object> które w innym wypadku nie byłyby potrzebne. Z pewnością miałoby to więcej sensu, gdyby nameof() wspierałoby niezwiązane leki generyczne. - Elte Hupkes


Po prostu użyj typu próbki, aby skompilować.

string name = nameof(IGenericInterface<int>.Method) // will be Method

2
2017-10-14 16:10