我安装了Visual Studio 15 Preview 3并尝试使用新的元组功能
static void Main(string[] args)
{
var x = DoSomething();
Console.WriteLine(x.x);
}
static (int x, int y) DoSomething()
{
return (1, 2);
}
当我编译时,我收到错误:
预定义类型'System.ValueTuple'2'未定义或导入
根据the blog post,此功能默认情况下应为“on”。
我做错了什么?
答案 0 :(得分:473)
对于.NET 4.6.2或更低版本,.NET Core 1.x和.NET Standard 1.x,您需要安装NuGet包System.ValueTuple
:
Install-Package "System.ValueTuple"
或在VS 2017中使用套餐参考:
<PackageReference Include="System.ValueTuple" Version="4.4.0" />
.NET Framework 4.7,.NET Core 2.0和.NET Standard 2.0包括这些类型。
答案 1 :(得分:37)
只要您未定位上述框架或更高版本(或.NET Core 2.0
/ .NET Standard 2.0
),您就需要引用ValueTuple
。通过添加System.ValueTuple
NuGet Package
答案 2 :(得分:13)
ValueTuple类型内置于更新的框架中:
在您定位其中一个较新的框架版本之前,您需要引用ValueTuple包。
http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html
的更多详情答案 3 :(得分:5)
对于 Visual Studio代码,使用内置的终端并运行:
dotnet add package "System.ValueTuple"
不要忘记之后运行dotnet restore
。
答案 4 :(得分:3)
确保已安装VS .NET 4.6.2 Developer Pack,然后从NuGet中提取System.ValueTuple
包。
答案 5 :(得分:3)
如果其他人遇到同样的问题,我在将项目更新到4.7后遇到了这个错误。奇怪的是,我不得不删除System.ValueTuple引用以消除此错误。
答案 6 :(得分:1)
我不建议添加ValueTuple
作为.net Framework项目的软件包引用。如您所知,该程序集可从4.7 .NET Framework中获得。
在某些情况下,您的项目将尝试不计一切代价地从.NET Framework文件夹而不是包文件夹包括ValueTuple
,这可能会导致某些未找到组装错误。
我们今天在公司遇到了这个问题。我们有2个项目的解决方案(我简化了):
Lib
Web
Lib
包含ValueTuple,而Web
使用Lib
。事实证明,由于某些未知原因,Web
试图将ValueTuple
放入.NET Framework目录时,并采用了错误的版本。因此,我们的应用程序崩溃了。 HintPath
在ValueTuple
的{{1}}中也没有在该程序集的.csproj
中定义。这个问题很奇怪。通常,它将从程序包文件夹复制程序集。这次不正常。
对我来说,总是有添加Web
软件包引用的风险。它们通常像定时炸弹一样。一开始它们很好,在最坏的时刻它们可以在您的脸上爆炸。我的经验法则:如果对{strong> .NET Framework 没有真正的需要,请不要使用HintPath
Nuget程序包。
我们通过在System.*
项目内的System.*
文件中手动添加ValueTuple
来解决问题。
答案 7 :(得分:1)
当我从.NET 4.6.2升级到.NET 4.7.2时,我也遇到了这个问题。不幸的是,我无法删除对System.ValueTuple
的软件包引用,因为我使用的另一个NuGet软件包依赖于它。
最后,我找到了根本原因:在项目文件夹中存在着{。{1}}的.NET 4.6.2版本(发布操作的输出),MSBuild决定引用此程序集而不是引用位于mscorlib.dll
中的官方.NET 4.7.2参考程序集。
由于.NET 4.7中引入了System.ValueTuple,因此MSBuild编译失败,因为它无法在.NET 4.6.2的引用程序集中找到类型。
答案 8 :(得分:0)
我必须检查System.ValueTuple.dll文件是否在源代码管理下并更正.cssproj文件中的引用:
<参考Include =“ System.ValueTuple”>
<提示路径>
.... \ ProjectName \ ProjectName \ obj \ Release \ Package \ PackageTmp \ bin \ System.ValueTuple.dll
参考>
进入
<参考Include =“ System.ValueTuple”>
.. \ packages \ System.ValueTuple.4.4.0 \ lib \ netstandard1.0 \ System.ValueTuple.dll
参考>
(可选):7.以这种方式解决另一个.dll文件的相同问题
答案 9 :(得分:0)
我们在针对框架4.5.2的一个旧项目中也遇到了同样的问题。我尝试了几种方案,包括上面列出的所有方案:目标4.6.1,添加System.ValueTuple程序包,删除bin,obj和.vs文件夹。没有骰子。对4.7.2重复相同的过程。然后尝试删除System.ValueTuple程序包,因为一位评论者建议我将目标定为4.7.2。依然没有。检查的csproj文件引用路径。看起来不错。甚至下降到4.5.2并再次安装该软件包。所有这几个VS都会重新启动,并多次删除相同的文件夹。从字面上看,什么都没有。
我不得不重构以使用结构。我希望其他人将来不再继续遇到这个问题,但是认为如果您像我们一样陷入困境,这可能会有所帮助。