我已经安装了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);
}
当我编译时,我得到错误:
预定义类型“系统”。ValueTuple´2´未定义或导入
根据这篇博文,这个功能在默认情况下应该是“开启”的。
我做错了什么?
当我从。net 4.6.2升级到。net 4.7.2时,我也遇到了这个问题。不幸的是,我无法删除对系统的包引用。ValueTuple,因为我使用的另一个NuGet包依赖于它。
最终我找到了根本原因:在项目文件夹中有一个。net 4.6.2版本的mscorlib.dll(发布操作的输出),MSBuild决定引用这个程序集,而不是位于C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2的官方。net 4.7.2参考程序集。
由于系统。ValueTuple是在。net 4.7中引入的,MSBuild编译失败,因为它在。net 4.6.2的参考程序集中找不到该类型。
(https://stackoverflow.com/a/57777123/128709副本)
我不建议将ValueTuple作为包引用添加到.net Framework项目中。如你所知,这个程序集可以从4.7 . net Framework中获得。
在某些情况下,你的项目会不惜一切代价从。net框架文件夹中包含ValueTuple,而不是包文件夹,这可能会导致一些程序集未找到错误。
我们今天在公司遇到了这个问题。我们有两个项目的解决方案(我过于简化了):
自由
网络
Lib包含ValueTuple, Web使用Lib。事实证明,由于一些未知的原因,Web在试图解析ValueTuple的路径时,将HintPath导入到. net Framework目录,并且采用了错误的版本。我们的应用程序因此崩溃了。在Web的.csproj中没有定义ValueTuple,也没有为该程序集定义HintPath。这个问题很奇怪。通常它会从包文件夹复制程序集。这次不正常。
对我来说,添加系统总是有风险的。*包引用。他们通常就像定时炸弹。他们一开始还好,但在最糟糕的时刻,他们可能会在你面前爆发。我的经验法则是:不要使用System。*如果不需要。net Framework的Nuget包。
我们通过手动将ValueTuple添加到Web项目中的.csproj文件中来解决这个问题。
我必须检查System.ValueTuple.dll文件是否在源代码控制下,并纠正其在.cssproj文件中的引用:
右键单击解决方案中的每个项目
卸载项目
编辑.cssproj文件:change
< Reference Include="System. "ValueTuple”>
< 提示路径>
.... ProjectName \ ProjectName obj \发行包PackageTmp \ bin \ ValueTuple。等系统。
</HintPath >
< /引用>
成
< Reference Include="System. "ValueTuple”>
< 提示路径>
ValueTuple \ packages系统。4 . 4。0李勃\ netstandard1 ValueTuple 0 \系统。等等
</HintPath >
< /引用>
保存更改并重新加载项目
找到System.ValueTuple.dll并保存到这个文件夹中
将此文件的引用添加到源代码控制中
(可选):7。用这种方法解决另一个.dll文件的相同问题