为什么一个别名的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-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 }
文件说:
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
所有构造函数。