Как это возможно, что .NET находит неправильный MyType в этом сценарии?
У меня есть тип A.B.C.D.MyType в проекте, над которым я работаю, и я ссылаюсь на DLL, имеющую тип A.B.MyType? Я не использую A.B; операторы в любом месте моего кода, и у меня есть 'using A.B.C.D;'. Когда я компилирую, компилятор считает, что любая голая ссылка на «MyType» означает «A.B.MyType».
Я знаю, что могу просто переименовать класс или использовать псевдоним, но мне интересно, как это вообще возможно.
Есть идеи?
Спасибо!





Просто предположите: в свойствах вашего проекта установлено ли «пространство имен по умолчанию» на A.B?
Ваш код находится в пространстве имен A.B или A.B.C? Если так, то, вероятно, проблема. Используйте такую директиву using:
using TheTypeIWant = A.B.C.D.MyType;
тогда просто обратитесь к TheTypeIWant в своем коде.
Обновлено: Я только что попробовал вариант «using MyType=A.B.C.D.MyType», но этот не работает. Вышесказанное, тем не менее, нормально.
@WillIAm: Нет, если вы хотите, чтобы псевдоним оставался общим, если вы понимаете, о чем я. Но, отвечая на заданный вопрос, не было никаких указаний на то, что были задействованы дженерики. Вопрос с конкретным примером использования дженериков, вероятно, приведет к другому решению.
Вы работаете в пространстве имен, которое находится под пространством имен A.B? (например, A.B.X), если это так, разрешения пространства имен C# (ECMA-334 Спецификация языка C#: 10.8 10.8 Пространство имен и имена типов) говорят:
... for each namespace N, starting with the namespace in which the namespace-or-typename occurs, continuing with each enclosing namespace (if any), and ending with the global namespace, the following steps are evaluated until an entity is located...
а затем следует:
If K is zero and the namespace declaration contains an extern-alias-directive or using-aliasdirective that associates the name I with an imported namespace or type, then the namespace-or-type-name refers to that namespace or type
Это означает, что разрешение имен начинается с текущего пространства имен и выполняет поиск во всех пространствах имен до корня, и только после завершения этого иерархического поиска выполняется поиск в пространствах имен, импортированных с предложением using.
В следующем примере печатается «Ns1.Foo».
using Ns1.Foo.Foo2;
namespace Ns1.Foo
{
class Foo
{
public void Print()
{
System.Console.WriteLine("Ns1.Foo");
}
}
}
namespace Ns1.Foo.Foo2
{
class Foo
{
public void Print()
{
System.Console.WriteLine("Ns1.Foo.Foo2");
}
}
}
namespace Ns1.Foo.Bar
{
class Bar
{
public void Print()
{
new Foo().Print();
}
static void Main()
{
new Bar().Print();
}
}
}
Обновлено: добавление предложения using внутри в пространство имен приведет к тому, что поиск пространства имен будет выполняться до того, как будет выполнен иерархический поиск текущего пространства имен. Измените пример на:
namespace Ns1.Foo.Bar
{
using Ns1.Foo.Foo2;
class Bar
{
public void Print()
{
new Foo().Print();
}
static void Main()
{
new Bar().Print();
}
}
}
и Ns1.Foo.Foo2 будет напечатан.
Обновлено: измененный пример
Я не думаю, что это работает с универсальными классами, верно?