Забавно, не смотря на то, что грамматика C# для указания аннотируемого атрибутом элемента языка, предусматривает ограниченный набор значений:

attribute-section:
[ attribute-target-specifieropt attribute-list ]
[ attribute-target-specifieropt attribute-list , ]

attribute-target-specifier:
attribute-target :

attribute-target:
field
event
method
param
property
return
type

На деле (компилятор С# 4.0) всё оказывается несколько иначе, код:

[someCrazyAttributeTargetLocation: Serializable]
class Foo { }

Компилируется без ошибок, но с одним warning’ом:

warning CS0658: ‘someCrazyAttributeTargetLocation’ is not a recognized attribute location. All attributes in this block will be ignored.

Соответственно, в рантайме получаем typeof(Foo).IsSerializable == false. Однако, читая Владимира Решетникова на rsdn, можно обнаружить, что существует ещё один attribute-target-specifier, не перечисленный в грамматике C#, который компилятор воспринимает без warning’а:

[AttributeUsage(AttributeTargets.GenericParameter)]
sealed class FooAttribute : Attribute { }

sealed class Bar<[typevar: Foo] T> { }

Знакомьтесь, скрытый attribute-target-specifier - typevar. Применение атрибута где-либо вне типа-параметра (если убрать [AttributeUsage]) будет результировать предупреждением CS0658.

Компилятор F# более строг и использование произвольных attribute-target не позволяет вовсе.