Использование Statement with Generics: использование ISet <>= System.Collections.Generic.ISet <>

Поскольку я использую два разных общих пространства имен экземпляров (System.Collections.Generic и Iesi.Collections.Generic), у меня конфликты. В других частях проекта я использую как структуру nunit, так и mstest, но имею в виду, что, когда я вызываю Assert, я хочу использовать версию nunit на

using Assert = NUnit.Framework.Assert;

Что отлично работает, но я хочу сделать то же самое с родовыми типами. Однако следующие строки не работают.

using ISet = System.Collections.Generic.ISet;
using ISet<> = System.Collections.Generic.ISet<>;

Кто-нибудь знает, как сообщить .net, как использовать инструкцию using с генериками?

Ответ 1

Я думаю, вам лучше сгладить сами пространства имен, а не общие типы (что, я думаю, не возможно).

Итак, например:

using S = System.Collections.Generic;
using I = Iesi.Collections.Generic;

Тогда для BCL ISet<int>, например:

S.ISet<int> integers = new S.HashSet<int>();

Ответ 2

К сожалению, директива using не делает то, что вы хотите. Вы можете сказать:

using Frob = System.String;

и

using ListOfInts = System.Collections.Generic.List<System.Int32>;

но вы не можете сказать

using Blob<T> = System.Collections.Generic.List<T>

или

 using Blob = System.Collections.Generic.List

Это недостаток языка, который никогда не исправлялся.

Ответ 3

Единственный способ, которым вы можете использовать общий тип, - это специализировать его следующим образом.

using IntSet = System.Collections.Generic.ISet<int>;

Вы не можете использовать псевдоним открытого типа, как это было в вашем примере:

using MySet = System.Collections.Generic.ISet<>;

Ответ 4

Ваше имя псевдонима совпадает с именем класса, поэтому у вас все еще есть двусмысленность, как если бы у вас было using для каждого пространства имен. Дайте псевдониму класса другое имя, то есть:

using FirstNamespace;
using OtherObject = SecondNamespace.MyObject;

public class Foo
{
    public void Bar()
    {
        MyObject first = new MyObject;//will be the MyObject from the first namespace
        OtherObject second = new OtherObject;
    }
}

Ответ 5

Вы можете использовать псевдоним класса:

using Test = NameSpace.MyClass;

Только если класс НЕ является общим.

Ответ 6

В некоторых случаях вы можете перейти с наследованием:

    public class MyList<T1, T2> : List<Tuple<IEnumerable<HashSet<T1>>, IComparable<T2>>> { }

    public void Meth()
    {
        var x = new MyList<int, bool>();
    }