预定义类型“System.ValueTuple´2´ 未定义或导入
Predefined type 'System.ValueTuple´2´ is not defined or imported
我已经安装了 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);
}
编译时出现错误:
Predefined type 'System.ValueTuple´2´ is not defined or imported
根据the blog post,此功能默认应为"on"。
我做错了什么?
对于 .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 包括这些类型。
确保安装了 .NET 4.6.2 Developer Pack for VS,然后从 NuGet 中拉入 System.ValueTuple
包。
对于Visual Studio代码使用内置的终端和运行:
dotnet add package "System.ValueTuple"
之后别忘了运行dotnet restore
。
它是 .NET Framework 4.7
的一部分。
只要您不针对上述框架或更高版本(或.NET Core 2.0
/.NET Standard 2.0
),您就需要参考ValueTuple
。通过添加 System.ValueTuple
NuGet Package
ValueTuple 类型内置于较新的框架中:
- .NET Framework 4.7
- .NET 核心 2.0
- 单声道 5.0
- .Net 标准 2.0
在您以这些较新的框架版本之一为目标之前,您需要引用 ValueTuple 包。
更多详情请见 http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html
如果其他人有同样的问题,我 运行 将项目更新到 4.7 后出现此错误。奇怪的是,我必须删除 System.ValueTuple 引用才能消除此错误。
我必须检查 System.ValueTuple.dll 文件是否受源代码控制并更正其在 .cssproj 文件中的引用:
- 右键单击解决方案中的每个项目
- 卸载项目
- 编辑 .cssproj 文件:更改
<参考包含="System.ValueTuple">
<提示路径>
.....\ProjectName\ProjectName\obj\Release\Package\PackageTmp\bin\System.ValueTuple.dll
< /HintPath>
< /参考>
进入
<参考包含="System.ValueTuple">
<提示路径>
..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll
< /HintPath>
< /参考>
- 保存更改并重新加载项目
- 找到System.ValueTuple.dll并将其保存到此文件夹
- 将此文件的引用添加到源代码管理中
(可选): 7. 用这种方法解决另一个.dll文件的相同问题
我不建议添加 ValueTuple
作为对 .net Framework 项目的包引用。如您所知,此程序集可从 4.7 .NET Framework 获得。
在某些情况下,您的项目会不惜一切代价尝试从 .NET Framework 文件夹而不是包文件夹中包含 ValueTuple
,这可能会导致一些程序集未找到错误。
我们公司今天遇到了这个问题。我们有 2 个项目的解决方案(我过于简单化了):
Lib
Web
Lib
包含 ValueTuple,Web
使用 Lib
。事实证明,由于某些未知原因,Web
在尝试解析 ValueTuple
的路径时将 HintPath
放入 .NET Framework 目录并且采用了错误的版本。我们的应用程序因此而崩溃。 ValueTuple
未在 Web
的 .csproj
中定义,也未在该程序集的 HintPath
中定义。这个问题很奇怪。通常它会从包文件夹中复制程序集。这次不正常。
对我来说,添加 System.*
包引用总是有风险的。他们经常像 time-bomb。它们一开始很好,在最糟糕的时刻它们会在你的脸上爆炸。我的经验法则:如果没有真正的需要,请不要将 System.*
Nuget 包用于 .NET Framework。
我们通过手动将 ValueTuple
添加到 Web
项目内的 .csproj
文件中解决了我们的问题。
我们在一个以 Framework 4.5.2 为目标的旧项目中看到了同样的问题。我尝试了几种方案,包括上面列出的所有方案:目标 4.6.1、添加 System.ValueTuple 包、删除 bin、obj 和 .vs 文件夹。没有骰子。对 4.7.2 重复相同的过程。然后尝试删除 System.ValueTuple 包,因为正如一位评论者所建议的那样,我的目标是 4.7.2。依然没有。检查了 csproj 文件引用路径。看起来不错。甚至回落到 4.5.2 并再次安装软件包。所有这一切都需要多次 VS 重新启动并多次删除相同的文件夹。完全没有效果。
我不得不重构以改用结构。我希望其他人以后不要继续 运行 解决这个问题,但如果您最终像我们一样被难倒,我认为这可能会有所帮助。
我在从 .NET 4.6.2 升级到 .NET 4.7.2 时也遇到了这个问题。不幸的是,我无法删除对 System.ValueTuple
的包引用,因为我使用的另一个 NuGet 包依赖于它。
我终于找到了根本原因:项目文件夹中有一个 mscorlib.dll
的 .NET 4.6.2 版本(发布操作的输出),MSBuild 决定引用这个程序集而不是位于 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2
.
中的官方 .NET 4.7.2 参考程序集
由于.NET 4.7引入了System.ValueTuple,MSBuild在.NET 4.6.2的引用程序集中找不到类型,导致编译失败
( 的副本)
我已经安装了 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);
}
编译时出现错误:
Predefined type 'System.ValueTuple´2´ is not defined or imported
根据the blog post,此功能默认应为"on"。
我做错了什么?
对于 .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 包括这些类型。
确保安装了 .NET 4.6.2 Developer Pack for VS,然后从 NuGet 中拉入 System.ValueTuple
包。
对于Visual Studio代码使用内置的终端和运行:
dotnet add package "System.ValueTuple"
之后别忘了运行dotnet restore
。
它是 .NET Framework 4.7
的一部分。
只要您不针对上述框架或更高版本(或.NET Core 2.0
/.NET Standard 2.0
),您就需要参考ValueTuple
。通过添加 System.ValueTuple
NuGet Package
ValueTuple 类型内置于较新的框架中:
- .NET Framework 4.7
- .NET 核心 2.0
- 单声道 5.0
- .Net 标准 2.0
在您以这些较新的框架版本之一为目标之前,您需要引用 ValueTuple 包。
更多详情请见 http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html
如果其他人有同样的问题,我 运行 将项目更新到 4.7 后出现此错误。奇怪的是,我必须删除 System.ValueTuple 引用才能消除此错误。
我必须检查 System.ValueTuple.dll 文件是否受源代码控制并更正其在 .cssproj 文件中的引用:
- 右键单击解决方案中的每个项目
- 卸载项目
- 编辑 .cssproj 文件:更改
<参考包含="System.ValueTuple">
<提示路径>
.....\ProjectName\ProjectName\obj\Release\Package\PackageTmp\bin\System.ValueTuple.dll
< /HintPath>
< /参考>
进入
<参考包含="System.ValueTuple">
<提示路径>
..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll
< /HintPath>
< /参考>
- 保存更改并重新加载项目
- 找到System.ValueTuple.dll并将其保存到此文件夹
- 将此文件的引用添加到源代码管理中
(可选): 7. 用这种方法解决另一个.dll文件的相同问题
我不建议添加 ValueTuple
作为对 .net Framework 项目的包引用。如您所知,此程序集可从 4.7 .NET Framework 获得。
在某些情况下,您的项目会不惜一切代价尝试从 .NET Framework 文件夹而不是包文件夹中包含 ValueTuple
,这可能会导致一些程序集未找到错误。
我们公司今天遇到了这个问题。我们有 2 个项目的解决方案(我过于简单化了):
Lib
Web
Lib
包含 ValueTuple,Web
使用 Lib
。事实证明,由于某些未知原因,Web
在尝试解析 ValueTuple
的路径时将 HintPath
放入 .NET Framework 目录并且采用了错误的版本。我们的应用程序因此而崩溃。 ValueTuple
未在 Web
的 .csproj
中定义,也未在该程序集的 HintPath
中定义。这个问题很奇怪。通常它会从包文件夹中复制程序集。这次不正常。
对我来说,添加 System.*
包引用总是有风险的。他们经常像 time-bomb。它们一开始很好,在最糟糕的时刻它们会在你的脸上爆炸。我的经验法则:如果没有真正的需要,请不要将 System.*
Nuget 包用于 .NET Framework。
我们通过手动将 ValueTuple
添加到 Web
项目内的 .csproj
文件中解决了我们的问题。
我们在一个以 Framework 4.5.2 为目标的旧项目中看到了同样的问题。我尝试了几种方案,包括上面列出的所有方案:目标 4.6.1、添加 System.ValueTuple 包、删除 bin、obj 和 .vs 文件夹。没有骰子。对 4.7.2 重复相同的过程。然后尝试删除 System.ValueTuple 包,因为正如一位评论者所建议的那样,我的目标是 4.7.2。依然没有。检查了 csproj 文件引用路径。看起来不错。甚至回落到 4.5.2 并再次安装软件包。所有这一切都需要多次 VS 重新启动并多次删除相同的文件夹。完全没有效果。
我不得不重构以改用结构。我希望其他人以后不要继续 运行 解决这个问题,但如果您最终像我们一样被难倒,我认为这可能会有所帮助。
我在从 .NET 4.6.2 升级到 .NET 4.7.2 时也遇到了这个问题。不幸的是,我无法删除对 System.ValueTuple
的包引用,因为我使用的另一个 NuGet 包依赖于它。
我终于找到了根本原因:项目文件夹中有一个 mscorlib.dll
的 .NET 4.6.2 版本(发布操作的输出),MSBuild 决定引用这个程序集而不是位于 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2
.
由于.NET 4.7引入了System.ValueTuple,MSBuild在.NET 4.6.2的引用程序集中找不到类型,导致编译失败
(