2010-09-15 20 views
36

由於我使用兩個不同的通用集合名稱空間(System.Collections.GenericIesi.Collections.Generic),所以我有衝突。在項目的其他部分,我同時使用NUnit的和MSTEST框架,但有資格當我打電話Assert我想在泛型中使用語句:使用ISet <> = System.Collections.Generic.ISet <>

using Assert = NUnit.Framework.Assert; 

偉大的工程使用NUnit的版本,但我想這樣做泛型類型的東西。但是,下面的行不起作用

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

有沒有人知道如何告訴.net如何使用using語句與泛型?

+3

這是一個偶然要求的功能。長期以來,它一直列在可能的功能列表中,但從未高度重視實際實施。 – 2010-09-15 18:12:50

+0

Eric,這是我第一次遇到這個問題,因爲.net 4.0框架添加了ISet <>,並且Iesi.Collections dll的目標是3.5。通常其他開發人員對與標準.net命名不衝突很好。 – 2010-09-17 13:01:59

+2

爲什麼你有兩個不同的命名空間?你能提供更多信息嗎? – 2013-03-12 18:18:56

回答

33

我認爲你最好別名命名空間本身,而不是泛型類型(我認爲這是不可能的)。

因此,例如:

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

那麼對於一個BCL ISet<int>,例如:

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

非常好的建議!這個問題剛剛發生在我身上,並沒有立即發生在我身上 – julealgon 2013-12-20 20:36:09

+0

只有當它是名字空間的時候才起作用如果類型參數本身有很長的類型名稱,那麼你的運氣就不好看了 – 2016-08-06 13:21:16

6

你可以別名一個泛型類型的唯一方法是如下專攻它。

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

,你在你的例子做了你不能別名開放式泛型類型:

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

謝謝Steve,I將能夠稍後使用! – 2010-09-17 13:04:37

+0

爲什麼你的第一個例子不能在VS2017上編譯? – mr5 2017-05-10 01:37:13

3

你的別名是相同的類名稱本身,所以你仍然有不確定性,就像如果每個命名空間都有一個using。給類的別名不同名,即:

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

可以別名類這樣做的:

using Test = NameSpace.MyClass; 

只有當該類不是通用的。

+4

你*可以*別名一個泛型類,你只是需要在別名中指定一個具體類型,而不是將其保留爲泛型。 – Servy 2013-03-12 18:25:27

33

不幸的是,using指令不會做你想做的。你可以說:

using Frob = System.String; 

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

,但你不能說

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

using Blob = System.Collections.Generic.List 

它從未得到糾正語言的缺點。

+0

遊說此功能的最佳方式是什麼? – miniBill 2014-12-13 16:11:36

+0

@miniBill:嘗試發佈到Roslyn.codeplex.com的語言設計論壇。 – 2014-12-15 16:38:44

0

在某些情況下,你可以繼承去:

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

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