在泛型中使用Statement:使用ISet<> = System.Collections.Generic.ISet<>

时间:2010-09-15 17:40:56

标签: c# generics syntax alias using

由于我使用两个不同的通用集合名称空间(System.Collections.GenericIesi.Collections.Generic),因此存在冲突。在项目的其他部分,我使用的是nunit和mstest框架,但在我调用Assert时我有资格使用nunit版本

using Assert = NUnit.Framework.Assert;

哪个很好用,但我想用泛型类型做同样的事情。但是,以下行不起作用

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

有没有人知道如何告诉.net如何使用带有泛型的using语句?

6 个答案:

答案 0 :(得分:37)

不幸的是,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

这是从未纠正的语言的缺点。

答案 1 :(得分:35)

我认为你最好别名命名空间本身而不是泛型类型(我认为不可能)。

例如:

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

然后是BCL ISet<int>,例如:

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

答案 2 :(得分:6)

您可以为泛型类别设置别名的唯一方法是将其专门化,如下所示。

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

您不能像在示例中那样使用开放泛型类型的别名:

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

答案 3 :(得分: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;
    }
}

答案 4 :(得分:0)

您可以为正在执行的课程别名:

using Test = NameSpace.MyClass;

仅当该类不是通用的时。

答案 5 :(得分:0)

在某些情况下,您可以使用继承:

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

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