Ponieważ używam dwóch różnych ogólnych przestrzeni nazw kolekcji (System.Collections.Generic
i Iesi.Collections.Generic
), Mam konflikty. W innych częściach projektu używam zarówno nunit, jak i mstest, ale kwalifikuję to, kiedy dzwonię Assert
Chcę użyć wersji nunit przez
using Assert = NUnit.Framework.Assert;
Co działa świetnie, ale chcę zrobić to samo z typami rodzajowymi. Jednak następujące wiersze nie działają
using ISet = System.Collections.Generic.ISet;
using ISet<> = System.Collections.Generic.ISet<>;
Czy ktoś wie, jak powiedzieć .net, jak używać instrukcji using w połączeniu z lekami generycznymi?
Odpowiedzi:
34 dla odpowiedzi nr 1Myślę, że lepiej jest aliasingować same przestrzenie nazw w przeciwieństwie do typów ogólnych (które nie uważam za możliwe).
Na przykład:
using S = System.Collections.Generic;
using I = Iesi.Collections.Generic;
Następnie dla BCL ISet<int>
, na przykład:
S.ISet<int> integers = new S.HashSet<int>();
35 dla odpowiedzi nr 2
Niestety using
dyrektywa nie robi tego, co chcesz. Możesz powiedzieć:
using Frob = System.String;
i
using ListOfInts = System.Collections.Generic.List<System.Int32>;
ale nie możesz powiedzieć
using Blob<T> = System.Collections.Generic.List<T>
lub
using Blob = System.Collections.Generic.List
Jest to wada języka, który nigdy nie został naprawiony.
6 dla odpowiedzi nr 3
Jedynym sposobem na alias typu ogólnego jest specjalizacja go w następujący sposób.
using IntSet = System.Collections.Generic.ISet<int>;
Nie można aliasować otwartego typu ogólnego, tak jak w przykładzie:
using MySet = System.Collections.Generic.ISet<>;
3 dla odpowiedzi № 4
Twój alias jest taki sam jak nazwa klasy, więc nadal masz dwuznaczność, tak jakbyś miał using
dla każdej przestrzeni nazw. Podaj alias klasy a różne nazwa, tj .:
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;
}
}
0 dla odpowiedzi № 5
Możesz dokonać aliasu klasy, wykonując:
using Test = NameSpace.MyClass;
Tylko jeśli klasa NIE jest ogólna.
0 dla odpowiedzi № 6
W niektórych przypadkach możesz przejść z dziedziczeniem:
public class MyList<T1, T2> : List<Tuple<IEnumerable<HashSet<T1>>, IComparable<T2>>> { }
public void Meth()
{
var x = new MyList<int, bool>();
}