好东西
// ok to alias a List Type
using AliasStringList = System.Collections.Generic.List<string>;
// and ok to alias a List of Lists like this
using AliasListOfStringList1 = System.Collections.Generic.List<System.Collections.Generic.List<string>>;
坏事
// However **error** to alias another alias
using AliasListOfStringList2 = System.Collections.Generic.List<AliasStringList>;
产生编译错误
类型或命名空间名称 找不到'AliasStringList' (你错过了使用指令或 汇编参考?)
注意:这是using directive而不是using statement。
答案 0 :(得分:8)
你不能使用在另一个使用中使用的别名声明的别名。对于像你这样的一组使用,你可以假设使用声明的兄弟不存在。
编写 using-alias-directives 的顺序没有任何意义,并且使用引用的 namespace-or-type-name 的解析-alias-directive 不受 using-alias-directive 本身或直接包含的编译单元或命名空间体中的其他using-directive的影响。换句话说, using-alias-directive 的 namespace-or-type-name 被解析为好像直接包含编译单元或命名空间体没有using-directives
它提供了您确切问题的简化示例,这是预期的行为:
namespace N1.N2 {}
namespace N3
{
using R1 = N1; // OK
using R2 = N1.N2; // OK
using R3 = R1.N2; // Error, R1 unknown
}
答案 1 :(得分:3)
答案 2 :(得分:0)
虽然这个问题没有要求在This duplicate question询问时消除编译错误的解决方案,但我会列出到目前为止我找到的内容。
Solution0:独立命名空间(Nick's answer)
Solution1:嵌套命名空间(受Nick's answer启发)
using StringList = System.Collections.Generic.List<string>;
namespace Inner {
using ListOfStringList = System.Collections.Generic.List<StringList>;
...
}
解决方案2:继承(Paul's answer)
using StringList = System.Collections.Generic.List<string>;
public class ListOfStringList : System.Collections.Generic.List<StringList> {}
...
但是解决方案2会遇到一些问题,你可能需要包装System.Collections.Generic.List<StringList>
的所有构造函数。