2010-09-15 9 views
36

Da ich zwei verschiedene generische Sammlung Namespaces (System.Collections.Generic und Iesi.Collections.Generic) verwende, habe ich Konflikte. In anderen Teilen des Projekts verwende ich sowohl die nunit und mstest Rahmen, aber qualifizieren, wenn ich Assert nenne ich die nunit Version vonVerwenden von Statement mit Generics: Verwenden von ISet <> = System.Collections.Generic.ISet <>

using Assert = NUnit.Framework.Assert; 

verwenden möchten die großen Werke, aber ich möchte das gleiche tun Sache mit generischen Typen. Die folgenden Zeilen funktionieren jedoch nicht

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

Weiß jemand, wie man .net sagt, wie man die using-Anweisung mit Generika verwendet?

+3

Dies ist eine gelegentlich gewünschte Funktion. Es war lange Zeit auf der Liste der möglichen Funktionen, war aber nie hoch genug, um es wirklich zu implementieren. –

+0

Eric, dies ist das erste Mal, dass ich auf dieses Problem gestoßen bin, da das .net 4.0-Framework ISet <> und die Iesi.Collections-DLL-Ziele 3.5 hinzugefügt haben. Normalerweise sind andere Entwickler gut darin, sich nicht mit der Standard-.NET-Benennung zu widersprechen. –

+2

Warum haben Sie es in zwei verschiedenen Namespaces? Können Sie mehr Informationen bereitstellen? –

Antwort

33

Ich denke, Sie sind besser dran Aliasing die Namespaces selbst im Gegensatz zu den generischen Typen (was ich glaube nicht, ist möglich).

So zum Beispiel:

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

dann für einen BCL ISet<int>, zum Beispiel:

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

Sehr netter Vorschlag! Had genau das gleiche Problem gerade jetzt und das ist mir nicht sofort aufgefallen – julealgon

+0

Das funktioniert nur, wenn es der Namespace ist, der das lange Bit ist.Wenn die Typparameter selbst lange Typnamen haben, haben Sie kein Glück –

6

Die einzige Möglichkeit, einen generischen Typ alias kann, ist es zu spezialisieren wie folgt.

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

Sie keine offene generische Typ alias können, wie Sie in Ihrem Beispiel getan haben:

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

Danke Steve, ich kann das später verwenden! –

+0

Warum wird Ihr erstes Beispiel nicht auf VS2017 kompiliert? – mr5

3

Ihr Aliasname der gleiche wie der Klassenname selbst ist, so dass Sie immer noch Unklarheit haben, wie wenn Sie einen using für jeden Namespace hatten. Geben Sie den Alias ​​der Klasse einen verschiedener Namen, 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

Sie können eine Klasse Tun alias:

using Test = NameSpace.MyClass; 

Nur wenn die Klasse nicht generisch ist.

+4

Sie * können * Alias ​​eine generische Klasse, nur Sie Sie müssen im Alias ​​einen konkreten Typ angeben, anstatt ihn als generisch zu definieren. – Servy

33

Leider funktioniert die using Direktive nicht, was Sie wollen. Sie können sagen:

using Frob = System.String; 

und

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

aber nicht

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

oder

using Blob = System.Collections.Generic.List 

Es ist ein Manko der Sprache sagen kann, die behoben wurde nie.

+0

Wie kann ich am besten für diese Funktion Lobbyarbeit leisten? – miniBill

+0

@miniBill: Versuchen Sie, im Sprachen-Design-Forum unter Roslyn.codeplex.com zu posten. –

0

In einigen Fällen können Sie mit Vererbung gehen kann:

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

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