Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用.NET4项目中的.NET3.5库时出现奇怪警告C4691_C#_C++ Cli - Fatal编程技术网

C# 使用.NET4项目中的.NET3.5库时出现奇怪警告C4691

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 { 公共静态

如果我有一个.NET 3.5,C#项目,它的类如下:

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#编译器的最新版本中也有所改变,顺便说一句,关于它有很多问题。这当然是一件小事。