1

我们的库中有一个名为 Action 的类型。我们支持 VS2005、2008,现在也尝试支持 VS2010。当我将包含我们的“Action”类型和“System”的命名空间一起包含在一个文件中并尝试使用它时,它会说我们的 Action 类型和 System.Action 委托之间存在模棱两可的引用调用。这仅在 VS2010 中发生,并且它不会在 VS2008 或 VS2005 中引发错误,即使 Action 委托没有任何改变(命名空间、程序集在 3.5 和 4.0 之间都是相同的)。知道为什么会发生这种情况吗?

更新:

我创建了一个简单的应用程序来重现这个:

Class1.cs:

using System;
using System.Collections.Generic;
using System.Text;

namespace Namespace1
{
    public enum Action
    {
        Mouse,
        Keyboard
    }
}

Class2.cs:

using Namespace1;
using System;
using System.Collections.Generic;
using System.Text;

namespace Namespace2
{
    public class Class2
    {
        public Class2()
        {
            Action a;
        }
    }
}

上述代码在 VS2008 中编译良好,但在 VS2010 中抛出错误:“错误 CS0104:'Action' 是 'Namespace1.Action' 和 'System.Action' 之间的模糊引用”

当我使用 VS2010 并以 Framework 3.5 而不是 4.0 为目标时,我得到了同样的错误。

谢谢,尼兰詹

4

1 回答 1

1

突然想到的问题是为什么它在 C#3 中没有歧义(我认为这将是一个语言错误)。

快速测试表明它是:

using System;
using ConsoleApplication1;

namespace ConsoleApplication1 {
    class Action { };
    class Program {
        static void Main(string[] args) {
            Action a = new Action();
        }
    }
}

class P2 {
    public void foo() {
        Action a;
    }
}

在 VS2008 (C#3) 中出现错误:“'Action' is an ambiguous reference between 'System.Action' and 'ConsoleApplication1.Action'” in P2.foo().

关于不同情况(例如当前命名空间中的标识符优先(class Program如上))的查找规则可能会略有变化。

有两种方法可以消除歧义:

  1. 使用完全限定的标识符(在上面,要么System.Action要么ConsoleApplication1.Action.
  2. 使用命名空间别名来完全限定标识符,而无需输入太多内容:

    使用 MyAction = MyNamespace.Action;

注意。VS2010/C#4 (beta 2) 与上面的代码给出了与 VS2008/C#3 相同的结果。

于 2010-01-13T12:19:20.887 回答