"使用" type alias指令不能在同一个命名空间中工作

时间:2014-12-07 03:43:28

标签: c# using

嗨,我有一个简单的问题

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

第二种情况,编译器无法找到&#39; TupleA&#39;类型! 我怎样才能使它有效? 我正在使用.Net Framework 4.5

2 个答案:

答案 0 :(得分:3)

您无法使用您想要的确切语法。这是因为C#规范的以下段落(见"9.4.1 Using alias directives"):

  

using-alias-directives的编写顺序没有意义,using-alias-directive引用的namespace-or-type-name的解析不受using-alias-directive本身的影响或者立即包含编译单元或命名空间体中的其他using-directive。

换句话说,C#编译器必须能够隔离地处理给定声明空间中的using别名指令的所有。因为顺序无关紧要,所以一个指令不能在同一个声明空间中引用别名。否则,编译器必须通过别名指令执行多次传递,迭代地尽可能多地声明并再次尝试,直到它成功声明所有别名,或者用尽新事物来声明。

正如您在自己的测试中已经看到的那样,您可以在包含要使用它的声明空间的声明空间中声明别名。这会对声明强制执行命令并允许使用别名。

答案 1 :(得分:0)

以下内容将起作用

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 Using alias directives