VS2010中的模糊引用错误

时间:2010-01-13 12:14:32

标签: .net visual-studio-2010-beta-2 ambiguous-call

我们的库中有一个名为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时,我得到了同样的错误。

谢谢, NIRANJAN

1 个答案:

答案 0 :(得分: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'是P2.foo()中'System.Action'和'ConsoleApplication1.Action'之间的模糊引用。

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

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

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

    使用MyAction = MyNamespace.Action;

  3. NB。 VS2010 / C#4(beta 2)与上面的代码VS2008 / C#3的结果相同。