使用泛型类型的'using alias = class'?

csh*_*net 92 .net c# generics alias

所以有时我想只从命名空间而不是整个命名空间中包含一个类,比如这里的例子我用using语句创建了该类的别名:

using System;
using System.Text;
using Array = System.Collections.ArrayList;
Run Code Online (Sandbox Code Playgroud)

我经常用泛型做到这一点,所以我不必重复这些论点:

using LookupDictionary = System.Collections.Generic.Dictionary<string, int>;
Run Code Online (Sandbox Code Playgroud)

现在我想用泛型类型完成相同的操作,同时将其保留为泛型类型:

using List<T> = System.Collections.Generic.List<T>;
Run Code Online (Sandbox Code Playgroud)

但是这不能编译,那么有什么方法可以实现创建这个别名,同时将类型保留为通用类型?

Jar*_*Par 94

不,那里没有.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
}
Run Code Online (Sandbox Code Playgroud)

  • 嘘.C#让我很想念C++模板.而C++模板错误消息让我想念C#. (10认同)
  • 令人失望的答案,但所有相同(因为答案是正确和相关的).: - / (2认同)

Geo*_*lis 11

http://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>;
Run Code Online (Sandbox Code Playgroud)

然后使用

gen::List<int> x = new gen::List<int>;
Run Code Online (Sandbox Code Playgroud)

要么

GenList x = new GenList();
Run Code Online (Sandbox Code Playgroud)

但是你必须在你使用它们的每个文件中复制使用定义的那些,所以如果你将来对它们进行一些更改而忘记在每个文件上更新,那么事情就会严重破坏.

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

  • 既然有人问,我知道这是旧的讨论,但我只是遇到了同样的问题,搜索引擎把我带到了这里 - 为什么我要关心这是旧的讨论?我们在做新闻吗? (9认同)
  • 因为答案没有帮助而被低估了 - 显示的所有内容都已在OP中声明并且不是一个有用的答案 - 事实上,这些知识是首先询问OP问题的必要先决条件.(关于"旧讨论"的内容,不确定这是如何相关的,Stack Overflow实际上会奖励你为旧讨论做出贡献 - 请参阅"死灵法师"徽章.) (6认同)
  • 在Silverlight论坛中,我的行为更加糟糕-他们只是删除较旧讨论中的所有帖子。他们并没有真正意识到人们会一遍又一遍地遇到这些问题,他们进入的讨论只提供了部分信息,导致没有人在找到问题的答案后就添加一些心理上的注意。他们的借口是将旧的讨论放在首位(好像没有新的更好的答案或发展要补充)。他们应该修复此类论坛,以便在更新时不会将非常老的话题摆在最前面,除非管理员将其放在顶部而不是浪费我们的时间... (4认同)
  • @ BrainSlugs83我发现此答案的第一部分很有帮助。1)OP没有“不”提及导入带有别名的名称空间作为选项(因此,“已显示的所有内容均已声明”是不正确的声明);2)间接导入“ [通用]类型”而不对“所有名称空间”造成污染的一种有效选择;“缺点”是需要添加前缀,这是一个简单的权衡。也使用别名[避免引入可能也存在的扩展方法](/sf/ask/233621741/)。 (2认同)