“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

“using”类型别名指令在同一个命名空间中不起作用

您无法使所需的确切语法正常工作。这是因为 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 使用别名指令