我们的库中有一个名为Action的类型。我们支持VS2005,2008,现在也试图支持VS2010。当我在文件中包含包含我们的'Action'类型和'System'的命名空间并尝试使用它时,它会在我们的Action类型和System.Action委托之间进行模糊的引用调用。这只发生在VS2010中并且它不会在VS2008或VS2005中抛出错误,即使Action委托没有任何改变(命名空间,程序集在3.5和4.0之间一切都是相同的)。知道为什么会这样吗?
更新
我创建了一个简单的应用程序来重现这个:
using System;
using System.Collections.Generic;
using System.Text;
namespace Namespace1
{
public enum Action
{
Mouse,
Keyboard
}
}
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
答案 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
)。
有两种方法可以消除歧义:
System.Action
或ConsoleApplication1.Action
。使用命名空间别名来完全限定标识符,而无需输入太多内容:
使用MyAction = MyNamespace.Action;
NB。 VS2010 / C#4(beta 2)与上面的代码VS2008 / C#3的结果相同。