【发布时间】:2011-10-31 00:36:20
【问题描述】:
考虑以下代码:
namespace ConsoleApplication
{
using NamespaceOne;
using NamespaceTwo;
class Program
{
static void Main(string[] args)
{
// Compilation error. MyEnum is an ambiguous reference
MethodNamespace.MethodClass.Frobble(MyEnum.foo);
}
}
}
namespace MethodNamespace
{
public static class MethodClass
{
public static void Frobble(NamespaceOne.MyEnum val)
{
System.Console.WriteLine("Frobbled a " + val.ToString());
}
}
}
namespace NamespaceOne
{
public enum MyEnum
{
foo, bar, bat, baz
}
}
namespace NamespaceTwo
{
public enum MyEnum
{
foo, bar, bat, baz
}
}
编译器抱怨 MyEnum 在调用 Frobble() 时是一个模棱两可的引用。由于调用的方法没有歧义,因此可能希望编译器根据方法签名解析类型引用。为什么不呢?
请注意,我并不是说编译器应该这样做。我相信它没有这样做是有充分理由的。我只是想知道那个原因是什么。
【问题讨论】:
-
它可能希望客户端确保它使用来自正确命名空间的正确枚举。
-
您将所有这些代码放在同一个文件中?还是每个命名空间都有一个文件?
-
@Juan Ayala:没关系;我确信编译器只对
ConsoleApplication命名空间中的usings 有问题。 -
@Code Monkey:是的,代码中的注释是这么说的。 OP 在问为什么编译器不想编译它。
-
也许编译器首先解析参数,然后解析调用签名——所以参数类型中的歧义导致进程停止?
标签: c# enums namespaces