Справочная информация: В спецификации атрибута attribute specification иногда есть два допустимых способа написания примененного атрибута. Например, если класс атрибута имеет имя HorseAttribute
, вы можете применить атрибут как [HorseAttribute]
или просто [Horse]
. Неопределенности можно устранить с помощью @
, например [@Horse]
.
Ниже приведена действительная программа:
using System;
using Alpha;
using Beta;
namespace N
{
[Horse]
class C
{
}
}
namespace Alpha
{
// valid non-abstract attribute type with accessible constructor
class HorseAttribute : Attribute
{
}
}
namespace Beta
{
// any non-attribute type with that name
enum Horse
{
}
}
Компилятор С# может выбрать Alpha.HorseAttribute
, когда я пишу только [Horse]
. В конце концов, тип Beta.Horse
совершенно не подходит для использования в спецификации атрибутов.
Даже если я поменяю имена, компилятор С# будет знать, что делать:
using System;
using Alpha;
using Beta;
namespace N
{
[Horse]
class C
{
}
}
namespace Alpha
{
// valid non-abstract attribute type with accessible constructor
class Horse : Attribute
{
}
}
namespace Beta
{
// any non-attribute type with that name
enum HorseAttribute
{
}
}
Опять же, компилятор знает, что я хочу Alpha.Horse
.
А теперь код, о котором я хочу спросить. Оно идентично приведенному выше, за исключением того, что два типа теперь имеют одинаковое имя:
using System;
using Alpha;
using Beta;
namespace N
{
[Horse]
class C
{
}
}
namespace Alpha
{
// valid non-abstract attribute type with accessible constructor
class Horse : Attribute
{
}
}
namespace Beta
{
// any non-attribute type with that name
enum Horse
{
}
}
Теперь С# -compiler отказывается строить, говоря:
Ошибка CS0104: "Лошадь" является неоднозначной ссылкой между "Alpha.Horse" и "Beta.Horse"
У меня вопрос: почему компилятор не может выбрать правильный в этом случае, если он хорошо это сделал в двух предыдущих примерах?
Соответствует ли это поведение спецификации языка С#? Действительно ли требуется, чтобы компилятор С# выдавал ошибку здесь?
(Конечно, я знаю, что могу решить эту проблему, сказав [Alpha.Horse]
в явном виде, поэтому я не прошу этого "решения".)