我试图在我的C#程序顶部定义一对类型别名。这是我尝试做的一个简短例子:
class MyContextMock : IContext
当我尝试使用mcs 3.2.8.0编译它时,我收到以下错误消息:
using System;
using System.Collections.Generic;
namespace Foo {
using TsvEntry = Dictionary<string, string>;
using Tsv = List<TsvEntry>;
}
是否可以在C#中的其他别名中使用foo.cs(6,19): error CS0246: The type or namespace name `TsvEntry' could not be found. Are you missing an assembly reference?
别名,或者我遗漏了using
语句的工作方式?
答案 0 :(得分:5)
检查此问题的文档:
https://msdn.microsoft.com/en-us/library/aa664765(v=vs.71).aspx
它说:
使用alias-directives的顺序没有 引用的namespace-or-type-name的重要性和解析 通过 using-alias-directive不受的影响 using-alias-directive本身或中的其他using-directives 立即包含编译单元或命名空间主体。其他 单词,using-alias-directive的namespace-or-type-name是 解决好像立即包含编译单元或 namespace body没有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-directive会导致编译时错误,因为 它不受第一个using-alias-directive的影响。
从技术上讲,你不能做同样的命名空间,但如果你在命名空间1中做别名,并在嵌套命名空间中为这个别名做别名,它就会起作用:
namespace N1
{
namespace N12 { }
}
namespace N2
{
using R1 = N1;
namespace N2
{
using R2 = R1.N12;
}
}
我不确定在您的具体示例中使用别名是否值得,考虑尽可能少地使用它们,主要用于解决名称空间冲突。
答案 1 :(得分:3)
来自MSDN's Using alias directives :
使用alias-directives的顺序没有 引用的namespace-or-type-name的重要性和解析 通过using-alias-directive不受其影响 using-alias-directive本身或其他using-directives 立即包含编译单元或命名空间体。其他 单词, using-alias-directive的namespace-or-type-name是 解决好像立即包含编译单元或 namespace body没有using-directives。
//强调我的
在您的示例中,最后一个using-alias-directive导致编译时错误,因为它不受第一个using-alias-directive的影响。
答案 2 :(得分:2)
作为对其他答案的补充。
如果您真的希望继续使用,那么嵌套命名空间将是最佳选择。因为对于第二个命名空间,然后将定义第一个使用。
以下内容可行,因为您位于更深的命名空间中:
namespace N1
{
using TsvEntry = Dictionary<string, string>;
namespace N1.N2
{
using Tsv = List<TsvEntry>;
}
}
请注意,虽然它有效但我不建议使用这种代码结构,因为你最终可能会使用深层嵌套的代码。
答案 3 :(得分:1)
正如其他人所提到的,使用Alias这种方式是不可能的,但是,你可以使用类继承来获得类似的功能。
使用您的示例,您可以执行以下操作:
using System;
using System.Collections.Generic;
namespace Foo {
class TsvEntry : Dictionary<string, string> {}
class Tsv : List<TsvEntry> {}
}
这样做的另一个好处是,您可以根据需要轻松地为这些类添加额外的功能。
答案 4 :(得分:1)
(在此添加此内容是因为我在搜索相关问题时经常遇到此问题,因此可能会对其他人有所帮助)
如果您要使用别名来实现某种编程风格的函数,那么您要找的是delegate
关键字。
您可以将delegate
看作是一个接口,只是它是一个函数。
所以代替
using Expression = Func<string>;
using Converter = Func<List<string>, Expression>;
你做
delegate string Expression();
delegate Expression Converter(List<string> tokenizedExpressions);
https://weblogs.asp.net/dixin/functional-csharp-function-type-and-delegate