2015-01-20 153 views
0

如果我有下面的類在.NET 3.5,C#項目:奇怪的警告C4691

namespace ClassLibrary1 
{ 
    public class Class1 
    { 
     public static void Method1(Func<int> func) 
     { 

     } 

     public static void Method2() 
     { 
     } 
    } 
} 

我嘗試從.NET 4.0使用,C++/CLI的項目,像這樣:

#include "stdafx.h" 

using namespace System; 
using namespace ClassLibrary1; 

int main(array<System::String ^> ^args) 
{ 
    Class1::Method2(); 
    return 0; 
} 

的C++/CLI項目編譯以下警告:

警告C4691: '系統::功能':類型引用是EXPE導入 未引用程序集'System.Core',當前定義的類型爲 而不是使用的翻譯單元2>此診斷髮生時 從程序集導入類型'ClassLibrary1 :: Class1' 'ClassLibrary1,Version = 1.0.0.0,Culture = neutral , PublicKeyToken = null'。

請注意,使用此庫的類似.NET 4.0 C#項目將在不發出警告的情況下進行編譯,因此這僅針對C++/CLI。從項目中引用System.Core不會刪除警告。這個警告在一般情況下似乎很有用,所以我不願意禁用它,還有什麼我可以做的嗎?

這在Visual Studio 2012和2013年

+0

我認爲它試圖說它期望在System.Core的3.5版本中找到System.Func。但是因爲你沒有引用它,所以它使用了4.0定義。你可以嘗試庫中的其他系統類型,看看你是否得到相同的警告。 – user957902 2015-01-20 22:33:38

+0

編譯器是否應該在查找可能的方法重載時發出診斷信息,並且因爲它不知道該方法是什麼而不能確定它是否屬於語言規範的一部分。這在最新版本的C#編譯器中也有所變化,並且有很多關於它的問題。當然無足輕重。 – 2015-01-21 15:37:26

回答

0

觀察到這可能是一個框架版本不匹配的爲C#項目建在.NET 3.5和您目前正使用.NET 4.0

引用它在C++項目

我的建議是分配在同一框架版本的兩個項目,無論是3.5還是4.0

這裏是一個link解釋更詳細一點此警告。

0

這最可能的原因是.Net 4.0的協方差變化。在這種情況下,NET 3.5的定義是:

public delegate TResult Func<TResult>() 

雖然.NET 4.0的定義是:

public delegate TResult Func<out TResult>() 

使用其他.NET庫項目(我試過List<T>)沒有任何變化不會產生這個錯誤。

如果我試圖以協變方式使用委託,我只會關注此警告。用Func<int>這是不太可能的。