为什么一个别名的C#Type不能被另一个访问?

好东西

// ok to alias a List Type using AliasStringList = System.Collections.Generic.List; // and ok to alias a List of Lists like this using AliasListOfStringList1 = System.Collections.Generic.List<System.Collections.Generic.List>; 

坏的东西

 // However **error** to alias another alias using AliasListOfStringList2 = System.Collections.Generic.List; 

产生编译错误

找不到类型或命名空间名称’AliasStringList’(您是否缺少using指令或程序集引用?)

注意:这是using指令而不是using语句 。

你只是不能使用在另一个使用中使用的别名声明的别名。 对于像您一样的一组使用,您可以假设使用声明的兄弟不存在。

来自MSDN

写入using-alias-directives的顺序没有意义, using-alias-directive引用的namespace-or-type-name的解析不受using-alias-directive本身或其他使用的影响立即包含编译单元或命名空间体中的指令。 换句话说, using-alias-directivenamespace-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 } 

文件说:

using alias指令的右侧必须始终是完全限定类型,而不管之前使用的using指令。

所以基本上alias指令忽略其他using指令。

虽然这个问题没有要求解决方案来消除编译错误,而这个重复的问题是询问,我将列出到目前为止我找到的内容。

  • Solution0:独立命名空间( 尼克的回答 )

  • 解决方案1:嵌套命名空间(受尼克回答的启发)

     using StringList = System.Collections.Generic.List; namespace Inner { using ListOfStringList = System.Collections.Generic.List; ... } 
  • 解决方案2:inheritance( 保罗的回答 )

     using StringList = System.Collections.Generic.List; public class ListOfStringList : System.Collections.Generic.List {} ... 

但是,Solution2会遇到一些问题,你可能需要包装System.Collections.Generic.List所有构造函数。