2010-09-15 17 views
36

Poiché utilizzo due diversi spazi dei nomi di raccolta generici (System.Collections.Generic e Iesi.Collections.Generic), ho dei conflitti. In altre parti del progetto, sto usando sia il NUnit e il quadro mstest, ma qualifico che quando chiamo Assert Voglio usare la versione NUnit perUtilizzo dell'istruzione con Generics: utilizzo di ISet <> = System.Collections.Generic.ISet <>

using Assert = NUnit.Framework.Assert; 

Quali grandi opere, ma voglio fare lo stesso cosa con tipi generici. Tuttavia, le seguenti linee non funzionano

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

Qualcuno sa come dire .net come utilizzare l'istruzione using con generics?

+3

Questa è una caratteristica di tanto in tanto richiesto. È stato sulla lista delle funzionalità possibili per un lungo periodo, ma non ha mai avuto una priorità sufficientemente alta da poter essere implementato. –

+0

Eric, questa è la prima volta che ho incontrato questo problema, dal momento che il framework .net 4.0 ha aggiunto ISet <> e la dll di Iesi.Collections ha 3.5. Di solito altri sviluppatori sono bravi a non contrastare con lo standard .net naming. –

+2

Perché lo hai in due diversi namespace? Potete fornire maggiori informazioni? –

risposta

33

Penso che sia meglio fare l'aliasing degli spazi dei nomi stessi rispetto ai tipi generici (che non credo sia possibile).

Così, per esempio:

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

Poi per un BCL ISet<int>, ad esempio:

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

Suggerimento molto carino! lo stesso identico problema proprio ora e questo non mi è venuto immediatamente in mente – julealgon

+0

Questo funziona solo se è lo spazio dei nomi che è il lungo termine.Se i parametri di tipo hanno lunghi nomi di tipo, sei sfortunato. –

6

L'unico modo è possibile alias un tipo generico è quello di specializzarsi come segue.

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

Non puoi alias un tipo generico aperta come avete fatto nel vostro esempio:

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

Grazie Steve, I sarà in grado di usarlo più tardi! –

+0

Perché il tuo primo esempio non verrà compilato su VS2017? – mr5

3

tuo nome alias è lo stesso del nome della classe stessa, in modo da avere ancora l'ambiguità, proprio come se avessi uno using per ogni spazio dei nomi. Dare l'alias della classe un diversa nome, cioè .:

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

È possibile alias un fare classe:

using Test = NameSpace.MyClass; 

Solo se la classe non è generico.

+4

Si * può * alias una classe generica, sei solo è necessario specificare un tipo concreto nell'alias piuttosto che lasciarlo generico. – Servy

33

Sfortunatamente, la direttiva using non fa quello che vuoi. Si può dire:

using Frob = System.String; 

e

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

, ma non si può dire

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

o

using Blob = System.Collections.Generic.List 

Si tratta di una lacuna del linguaggio che non è mai stato risolto.

+0

Qual è il modo migliore per fare lobby per questa funzione? – miniBill

+0

@miniBill: prova a postare nel forum di progettazione della lingua su Roslyn.codeplex.com. –

0

In alcuni casi si può andare con l'ereditarietà:

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

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