所以有时我想只从命名空间而不是整个命名空间中包含一个类,就像这里的例子一样,我使用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>;
但是这不能编译,那么有什么方法可以实现创建这个别名,同时将类型保留为通用类型?
答案 0 :(得分:89)
不,没有。 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
}
答案 1 :(得分:7)
如http://msdn.microsoft.com/en-us/library/sf0df423.aspx和http://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#会像处理扩展方法那样处理别名,让你在其他地方使用的文件中定义其中的许多别名,然后将它们保存在一个地方并隐藏类型中的内部不必要的类型映射细节消费者。