【问题标题】:Using a 'using alias = class' with generic types? [duplicate]使用带有泛型类型的“使用别名 = 类”? [复制]
【发布时间】:2011-02-08 18:38:47
【问题描述】:

所以有时我只想包含一个命名空间中的一个类,而不是整个命名空间,就像这里的示例一样,我使用 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# .net generics alias


【解决方案1】:

不,没有。 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
}

【讨论】:

  • 使用别名指令的右侧不能有开放的泛型类型。例如,您不能为 List 创建使用别名,但可以为 List 创建一个别名。 msdn.microsoft.com/en-us/library/sf0df423.aspx
  • 令人失望的答案,但都赞成(因为答案是正确且相关的)。 :-/
  • 嘘。 C# 让我非常想念 C++ 模板。而 C++ 模板错误消息让我想念 C#。
【解决方案2】:

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>;

然后使用

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

GenList x = new GenList();

但是,您必须在使用它们的每个文件中复制那些 using 定义,因此,如果您将来对它们进行一些更改而忘记在每个文件中更新,事情会很糟糕。

我希望未来的 C# 将像 do with extension 方法一样处理别名,并让您在一个文件中定义其中的许多别名,然后在其他地方使用它们,然后将它们维护在一个地方并隐藏类型中不必要的内部类型映射细节消费者。

【讨论】:

  • 既然有人问,我确实知道这是旧讨论,但我也遇到了同样的问题,搜索引擎把我带到了这里 - 我为什么要关心这是否是旧讨论?我们在做新闻吗?
  • 我在 Silverlight 论坛中的行为更加糟糕——他们只是删除了旧讨论中的所有帖子。他们并没有真正理解人们一次又一次地遇到这些问题,并且他们进行了包含部分信息的讨论,因为在他们找到问题的答案后,没有人会费心添加一些心理笔记。他们的借口是它把旧的讨论带到了顶部(好像没有新的更好的答案或发展要添加)。他们应该修复此类论坛,以便在更新时不会将非常旧的主题带到最前面,除非管理员将它们粘贴到顶部而不是浪费我们的时间......
  • 投反对票,因为答案没有帮助 - 显示的所有内容都已在 OP 中声明并且不是有用的答案 - 事实上,这些知识是首先提出 OP 问题的必要先决条件地方。 (关于“旧讨论”的东西,不确定这有什么关系,Stack Overflow 实际上会奖励您为旧讨论做出贡献 - 请参阅“死灵法师”徽章。)
  • @BrainSlugs83 我发现这个答案的第一部分很有帮助。 1) OP 确实 not 提到导入带有别名的命名空间作为选项(因此“显示的所有内容都已声明”是不正确的陈述); 2) 在不污染“所有命名空间”的情况下,间接导入“a [generic] type”是一种有效的选择; “缺点”是需要添加前缀,这是一个简单的权衡。也使用别名avoids pulling in extension methods that may also exist
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2023-03-03
相关资源
最近更新 更多