Взгляните на следующий код и попробуйте определить, что аннотирует атрибут — возвращаемое значение или метод:
class MyClass {
[HRESULT]
public long Foo(); }
Если у вас есть опыт работы с СОМ, вы должны знать, что HRESULT — это стандартный возвращаемый тип для всех методов, кроме AddRef или Release. Однако нетрудно заметить, что если имя атрибута применимо и к возвращаемому значению, и к имени метода, то компилятору будут непонятны ваши намерения. Вот несколько сценариев, -в которых компилятор не поймет ваших намерений из контекста:
В каждом из этих случаев компилятор производит определение на основе того, что считается "наиболее употребительным". Чтобы обойти такой путь принятия решения, используйте идентификаторы атрибута: assembly, module, type, method, property, event, field, param, return.
Чтобы воспользоваться идентификатором атрибута, поставьте перед именем атрибута идентификатор и двоеточие. В примере
MyClass,
чтобы быть уверенным в том, что компилятор сможет определить
HRESULT
как атрибут, аннотирующий возвращаемое значение, а не как метод, вы должны задать его следующим образом:
class MyClass {
[return:HRESULT]
public long Foo(); }