C# 使用.NET4项目中的.NET3.5库时出现奇怪警告C4691
如果我有一个.NET 3.5,C#项目,它的类如下:C# 使用.NET4项目中的.NET3.5库时出现奇怪警告C4691,c#,c++-cli,C#,C++ Cli,如果我有一个.NET 3.5,C#项目,它的类如下: namespace ClassLibrary1 { public class Class1 { public static void Method1(Func<int> func) { } public static void Method2() { } } } 命名空间类库1 { 公共班级1 { 公共静态
namespace ClassLibrary1
{
public class Class1
{
public static void Method1(Func<int> func)
{
}
public static void Method2()
{
}
}
}
命名空间类库1
{
公共班级1
{
公共静态无效方法1(Func Func)
{
}
公共静态无效方法2()
{
}
}
}
我尝试从.NET 4.0、C++/CLI项目中使用它,如下所示:
#include "stdafx.h"
using namespace System;
using namespace ClassLibrary1;
int main(array<System::String ^> ^args)
{
Class1::Method2();
return 0;
}
#包括“stdafx.h”
使用名称空间系统;
使用命名空间ClassLibrary1;
int main(数组^args)
{
方法2();
返回0;
}
C++/CLI项目编译时会出现以下警告:
警告C4691:“System::Func”:中应为引用的类型
未引用的程序集“System.Core”,类型在当前文件中定义
使用了转换单元2>发生了此诊断
从程序集导入类型“ClassLibrary1::Class1”时
“ClassLibrary1,版本=1.0.0.0,区域性=中性,
PublicKeyToken=null'
请注意,使用此库的类似.NET 4.0 C#项目将在没有警告的情况下编译,因此这是特定于C++/CLI的。从项目中引用System.Core不会删除警告。这个警告在一般情况下似乎很有用,所以我不愿意禁用它,还有什么我可以做的吗
这是在Visual Studio 2012和2013中观察到的。
< P>这可能是一个框架版本不匹配,因为您的C项目是在.NET 3.5中构建的,而您引用的是使用.NET 4 的C++项目。 我的建议是为这两个项目分配相同的框架版本,3.5或4.0下面是一个更详细地解释此警告的示例。最可能的原因是.Net 4.0的协方差变化。在这种情况下,.Net 3.5的定义是:
public delegate TResult Func<TResult>()
public delegate TResult Func<out TResult>()
public委托TResult Func()
而.Net 4.0的定义是:
public delegate TResult Func<TResult>()
public delegate TResult Func<out TResult>()
public委托TResult Func()
在不做任何更改的情况下使用其他.Net库项(我尝试了列表)不会产生此错误
如果我试图以协变的方式使用委托,我只会担心这个警告。使用Func
是不太可能的。我想它是想说它希望在System.Core的3.5版本中找到System.Func。但由于您没有引用它,因此它使用了4.0定义。您可以尝试库中的其他系统类型,看看是否会收到相同的警告。编译器在查找可能的方法重载时是否应该发出诊断,并且无法确定,因为它只是不知道该方法的外观,这不属于语言规范的一部分。这一点在C#编译器的最新版本中也有所改变,顺便说一句,关于它有很多问题。这当然是一件小事。