嵌套类型定义的 Using 指令

Using directive for nested type definitions

提问人:SzymonPajzert 提问时间:9/1/2017 最后编辑:RobSzymonPajzert 更新时间:5/8/2023 访问量:293

问:

我正在尝试使用该指令以函数式方式定义类型,以使代码更具可读性。假设我的示例 .cs 文件如下所示:using

using A = System.Tuple<int, int>;
using B = List<A>;

我收到错误:

CS0246:找不到类型或命名空间名称“A”(是否缺少 using 指令或程序集引用?

我可以定义嵌套类型吗?using

C# using 指令

评论

4赞 Sinatr 9/1/2017
using B = System.Collections.Generic.List<System.Tuple<int, int>>;.使用 using 时,您不能使用其他 using,请始终完全指定类型名称。你在定义时已经经历过这一点,不是吗? 无法修复错误。Ausing System;
1赞 Rob 9/1/2017
@SzymonPajzert,我希望你不介意,但是当我将代码片段放入.cs文件以替换您的释义版本时,我已经添加了从您的代码片段中生成的错误。我这样做是为了让其他人将来更容易找到这个问题 - 如果您遇到不同的错误(因为我误解了您的问题),请回滚更新,或使用您收到的特定错误进行更新 =)

答:

4赞 Rob 9/1/2017 #1

learn.microsoft.com 上的 C# 语言规范有一个部分介绍了 Using 指令,具体来说,您尝试使用的 using 指令类型是“Using alias 指令”:

using_alias_directive(使用别名指令)为命名空间或类型引入别名。

该文档突出显示了允许的using_alias_directive结构,如下所示:

using_alias_directive
    : 'using' identifier '=' namespace_or_type_name ';'
    ;

请注意,这只允许使用“namespace_or_type_name”,但不允许使用另一个“using_alias_directive”。其中一个可能的原因,可以在他们的文档中找到(强调我的):

using_alias_directives的编写顺序没有意义,using_alias_directive引用的namespace_or_type_name的解析不受using_alias_directive本身或立即包含的编译单元或命名空间主体中的其他using_directives的影响。换言之,using_alias_directive的namespace_or_type_name被解析为立即包含的编译单元或命名空间正文没有using_directives

简而言之,恐怕您不能在另一个别名中使用别名。

评论

0赞 Jeroen Mostert 9/1/2017
所有具有“组织/排序指令”功能的重构工具的作者都松了一口气。using
0赞 Rob 9/1/2017
@JeroenMostert,这是本世纪的轻描淡写!=)
0赞 Misha Zaslavsky 5/8/2023 #2

在 C# 12 预览版中,可以允许使用 alias 指令引用任何类型的 Type

从 C# 12 开始,可以为以前受限制的类型创建别名,包括元组类型、指针类型和其他不安全类型。有关 udpated 规则的更多信息。