嗨,我有一个简单的问题
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
答案 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