我已经安装了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´未定义或导入
根据这篇博文,这个功能在默认情况下应该是“开启”的。
我做错了什么?
We were seeing this same issue in one of our old projects that was targeting Framework 4.5.2. I tried several scenarios including all of the ones listed above: target 4.6.1, add System.ValueTuple package, delete bin, obj, and .vs folders. No dice. Repeat the same process for 4.7.2. Then tried removing the System.ValueTuple package since I was targeting 4.7.2 as one commenter suggested. Still nothing. Checked csproj file reference path. Looks right. Even dropped back down to 4.5.2 and installing the package again. All this with several VS restarts and deleting the same folders several times. Literally nothing worked.
我不得不重构以使用结构体代替。我希望其他人将来不要继续遇到这个问题,但如果你最终像我们一样被难住了,这可能会有帮助。
当我从。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文件中来解决这个问题。