C#中为何无法在类型别名定义中使用已定义类型别名作为泛型参数?
C# 命名空间级别using别名无法互相引用的原因
这不是编译器bug,是C#的设计特性,核心原因来自命名空间级别的using别名解析规则:
- 命名空间下的using别名是按顺序逐一定义、独立解析的,定义后续别名时,无法引用同一命名空间中前面刚定义的别名——编译器处理
IntPairList时,IntPair这个别名还没完成绑定,自然会提示“找不到类型”。 - 而类内部的代码属于命名空间成员的作用域,此时所有命名空间级别的using别名都已经完成全局解析,所以
Bar类里的List<IntPair>能正常编译。
如果需要用前一个别名来定义新的别名,有两种可行的修正方式:
// 方式1:直接展开前一个别名对应的原始类型 using IntPair = Tuple<int, int>; using IntPairList = List<Tuple<int, int>>; // 方式2:把别名定义移到类内部(类级别的using别名可以互相引用) namespace Foo { class Bar { using IntPair = Tuple<int, int>; using IntPairList = List<IntPair>; // 此处编译正常 static List<IntPair> list; } }
内容的提问来源于stack exchange,提问作者Ivan Krivyakov
相关产品推荐
相关产品推荐

