Da ich zwei verschiedene generische Sammlungsnamespaces verwende (System.Collections.Generic
und Iesi.Collections.Generic
Ich 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 № 1Ich 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>();
}