/ / Korzystanie z instrukcji w Generics: using ISet <> = System.Collections.Generic.ISet <> - c #, generics, składnia, alias, używanie

Używanie instrukcji Statement with Generics: using ISet <> = System.Collections.Generic.ISet <> - c #, generics, syntax, alias, using

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 1

Myś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>();
}