/ / Using Statement with Generics: using ISet <> = System.Collections.Generic.ISet <> - c #, Generics, Syntax, Alias, using

Mit Statement mit Generics: mit ISet <> = System.Collections.Generic.ISet <> - c #, Generika, Syntax, alias, mit

Da ich zwei verschiedene generische Sammlungsnamespaces verwende (System.Collections.Generic und Iesi.Collections.GenericIch habe Konflikte. In anderen Teilen des Projekts verwende ich sowohl das Nunit- als auch das Mstest-Framework, aber das qualifiziere ich, wenn ich anrufe Assert Ich möchte die Nunit-Version von verwenden

using Assert = NUnit.Framework.Assert;

Was gut funktioniert, aber ich möchte dasselbe mit generischen Typen tun. Die folgenden Zeilen funktionieren jedoch nicht

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

Weiß jemand, wie .net zu erklären ist, wie die using-Anweisung mit Generika verwendet wird?

Antworten:

34 für die Antwort № 1

Ich denke, es ist besser, wenn man die Namespaces selbst als Aliasing bezeichnet, im Gegensatz zu den generischen Typen (die ich für unmöglich halte).

So zum Beispiel:

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

Dann für eine BCL ISet<int>, beispielsweise:

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

35 für die Antwort № 2

Leider using Direktive macht nicht was Sie wollen. Sie können sagen:

using Frob = System.String;

und

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

aber du kannst es nicht sagen

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

oder

 using Blob = System.Collections.Generic.List

Es ist ein Manko der Sprache, die nie korrigiert wurde.


6 für die Antwort № 3

Sie können einen generischen Typ nur als Alias ​​verwenden, indem Sie ihn wie folgt spezialisieren.

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

Sie können einen offenen generischen Typ nicht wie in Ihrem Beispiel als Alias ​​bezeichnen:

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

3 für die Antwort № 4

Ihr Aliasname ist derselbe wie der Klassenname selbst, so dass Sie immer noch mehrdeutig sind, als hätten Sie einen using für jeden Namespace. Geben Sie den Alias ​​der Klasse ein anders Name, d.h .:

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 für die Antwort № 5

Sie können eine Klasse als Alias ​​bezeichnen:

using Test = NameSpace.MyClass;

Nur wenn die Klasse NICHT generisch ist.


0 für die Antwort № 6

In einigen Fällen können Sie mit der Vererbung beginnen:

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

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