关于ExtensionAttribute的奇怪警告

时间:2009-02-13 17:17:44

标签: c# compiler-warnings

我收到一个奇怪的警告:

  

预定义类型'System.Runtime.CompilerServices.ExtensionAttribute'在全局别名中的多个程序集中定义;使用'c:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.5 \ System.Core.dll'中的定义

没有给出行号,因此很难弄清楚它是什么。

编译器错误代码为CS1685

6 个答案:

答案 0 :(得分:21)

你是否正在使用某人的dll(或你自己的)已经实现了这个属性(具有完全相同的名称)本身作为在.Net 3.5运行时使用某些c#3.0功能的方法? (一个常见的伎俩)

这是可能的原因。由于它使用了正确的(GAC中的MS),这不是问题,尽管你应该追捕另一个并删除它。

答案 1 :(得分:12)

扩展ShuggyCoUk的(正确的)答案

说实话,使用哪个版本的属性(GAC,第3部分等等)并不重要。重要的是C#/ VB编译器可以找到一些具有正确名称的属性。该属性在代码中不起作用。它纯粹是为了告诉编译器“嘿,这是一种扩展方法”。

您可以放心地忽略此警告。

答案 2 :(得分:11)

我同意ShuggyCoUk的观点,最好的做法是尝试删除有问题的dll。但这可能是不可能的。

解决编译器抱怨的歧义的另一种方法是更改​​引用的dll的别名。在您的项目中,在References文件夹中,如果单击引用的dll,您将看到Aliases属性。默认情况下,这是“全局”,它允许您执行“global :: SomeNamespace.SomeType”之类的操作。您可能只需将别名更改为其他内容。

这解决了我需要引用Microsoft.Scripting.Core.dll的问题,但它包含了一些与mscorlib.dll冲突的类型。我将Aliases属性更改为“ThirdParty”而不是“global”,并修复了警告。

答案 3 :(得分:1)

我有同样的问题。

在我的情况下,问题是程序集Mono.Cecil。

从本地引用迁移到nuget,当我添加NHibernate引用时,包会自动添加此引用。

此参考已删除,并再次编译我的项目。

删除它并开心!!

此图片来自ILSpy(http://i.stack.imgur.com/Qyd5o.png

答案 4 :(得分:0)

编译器不知道哪个System.Runtime.CompilerServices.ExtensionAttribute

所以它使用来自c:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.5 \ System.Core.dll'的定义

您使用的.dll可能具有相同的扩展名。

答案 5 :(得分:0)

我通过意外安装IIS而不是4.5安装IIS来触发此错误。

修复是在"添加功能中添加4.5 ..."在控制面板中。