Использование Statement с Generics: использование ISet <> = System.Collections.Generic.ISet <> - PullRequest
40 голосов
/ 15 сентября 2010

Поскольку я использую два разных пространства имен универсальной коллекции (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 с обобщениями?

Ответы [ 6 ]

37 голосов
/ 12 марта 2013

К сожалению, директива 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

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

35 голосов
/ 15 сентября 2010

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

Так, например:

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

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

S.ISet<int> integers = new S.HashSet<int>();
6 голосов
/ 15 сентября 2010

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

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

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

using MySet = System.Collections.Generic.ISet<>;
3 голосов
/ 12 марта 2013

Ваше имя псевдонима совпадает с именем самого класса, поэтому у вас все еще есть неоднозначность, как будто у вас есть 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;
    }
}
1 голос
/ 31 января 2016

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

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

    public void Meth()
    {
        var x = new MyList<int, bool>();
    }
0 голосов
/ 12 марта 2013

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

using Test = NameSpace.MyClass;

Только если класс НЕ является универсальным.

...