Вы можете использовать диагностическую директиву:
#error Oops. This is an error.
или просто для предупреждения:
#warning This is just a warning.
Обычно вы хотите поместить их в условные блоки, я ожидаю...
РЕДАКТИРОВАТЬ: Хорошо, теперь вы обновили свой вопрос, вы просто не можете сделать это во время компиляции.Ваше предложение использовать Assert.Fail
указывает на проблему во время выполнения.
Я бы посоветовал вам написать модульные тесты, чтобы обнаружить это (перебрать все типы в сборке и проверить, что атрибут был применен только вчаще всего один раз для каждого типа).
РЕДАКТИРОВАТЬ: в 2016 году ... хотя анализ кода, предложенный ОП, на самом деле не является ошибкой компилятор , теперь, когда Visual Studio использует Roslyn, это возможноподключиться к компилятору и действительно получить ошибку от компилятора, используя анализатор кода Roslyn.Тем не менее, я бы все же лично предпочел бы для этого модульные тесты, поскольку тогда любой мог бы создавать и тестировать код независимо от того, установлен ли у них анализатор Roslyn.До сих пор нет способа проверить это с помощью «чисто ванильного» компилятора C #.