Использование 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>();
}