c# - 泛型约束 - 泛型接口




在泛型类型中使用'using alias=class'? (2)

这个问题在这里已经有了答案:

所以有时我想只包含一个来自命名空间的类而不是整个命名空间,就像这里的示例,我使用using语句为该类创建了一个别名:

using System;
using System.Text;
using Array = System.Collections.ArrayList;

我经常用泛型来做这件事,所以我不必重复这些论点:

using LookupDictionary = System.Collections.Generic.Dictionary<string, int>;

现在我想用一个泛型类型来完成它,同时将它保存为一个泛型类型:

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

但是这不能编译,那么有什么办法可以实现创建这个别名,而将类型保留为泛型?


不,那里没有。 C#中的类型别名必须是封闭的(又称完全解析)类型,因此不支持开放泛型

这在C#语言规范的第9.4.1节中有介绍。

使用别名可以命名一个封闭的构造类型,但不能在未提供类型参数的情况下命名未绑定的泛型类型声明。

namespace N2
{
    using W = N1.A;         // Error, cannot name unbound generic type
    using X = N1.A.B;           // Error, cannot name unbound generic type
    using Y = N1.A<int>;        // Ok, can name closed constructed type
    using Z<T> = N1.A<T>;   // Error, using alias cannot have type parameters
}

msdn.microsoft.com/en-us/library/sf0df423.aspxhttp://msdn.microsoft.com/en-us/library/c3ay4x3d%28VS.80%29.aspx所示,您可以做

using gen = System.Collections.Generic;
using GenList = System.Collections.Generic.List<int>;

然后使用

gen::List<int> x = new gen::List<int>;

要么

GenList x = new GenList();

但是,您必须在每个使用它们的文件中复制这些定义,因此如果将来对它们进行了一些更改并忘记在每个文件中进行更新,则事情将会严重破坏。

我希望C#将来会像使用扩展方法一样处理别名,并让你在其他地方使用的文件中定义许多别名,然后将它们保留在一个地方,并从类型使用者处隐藏内部不必要的类型映射细节。





alias