“using”类型别名指令在同一个命名空间中不起作用
本文关键字:同一个 命名空间 不起作用 指令 using 类型 别名 | 更新日期: 2023-09-27 18:33:20
嗨,我有一个简单的问题
namespace A
{
using TupleA = Tuple<int, int>;
namespace B
{
using DicB = Dictionary<TupleA, int>;
}
}
它可以遵守......但这不是。
namespace A
{
using TupleA = Tuple<int, int>;
using DicB = Dictionary<TupleA, int>;
}
第二种情况,编译器找不到"TupleA"类型!我怎样才能让它工作?我正在使用.Net Framework 4.5
您无法使所需的确切语法正常工作。这是因为 C# 规范中的以下段落(请参阅"9.4.1 使用别名指令"(:
使用 alias 指令的编写顺序没有意义,并且 using-alias-指令引用的命名空间或类型名称的解析不受 using-alias-指令本身或直接包含编译单元或命名空间正文中的其他 using-指令的影响。
换句话说,C# 编译器必须能够独立处理给定声明空间中的所有 using
别名指令。由于顺序无关紧要,因此一个指令不能引用同一声明空间中的别名。否则,编译器将不得不通过 alias 指令执行多次传递,迭代声明尽可能多的指令,然后重试,直到它成功声明所有别名,或者用完要声明的新内容。
正如您在自己的测试中看到的那样,您可以在包含要使用它的声明空间的声明空间中声明别名。这会对声明施加顺序,并允许使用别名。
以下内容将起作用
namespace A
{
using TupleA = System.Tuple<int, int>;
using DicB = System.Collections.Generic.Dictionary<System.Tuple<int, int>, int>;
}
或者如果您必须
using TupleA = System.Tuple<int, int>;
namespace A
{
using DicB = System.Collections.Generic.Dictionary<TupleA, int>;
}
更新
与您尝试执行的操作相关的 MSDN 9.3.1 使用别名指令