【问题标题】:Predefined type 'System.ValueTuple´2´ is not defined or imported未定义或导入预定义类型“System.ValueTuple´2”
【发布时间】:2016-11-17 21:19:20
【问题描述】:

我已经安装了 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,默认情况下此功能应为“开启”。

我做错了什么?

【问题讨论】:

  • 有谁知道即使在 2017 RTM 目标 4.6.2 中是否需要 NuGet 包?看起来你仍然需要它,我预计你不会在最终版本中。
  • 你可以尝试使用 System.Tuple 代替
  • 对我来说,stackoverflow.com/a/46533630/4383425 是解决方案。

标签: c# visual-studio-2017 c#-7.0


【解决方案1】:

对于 .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 包括这些类型。

【讨论】:

  • 谢谢。这是否意味着它可以与 4.6.2 一起使用?调试器仍然显示 x.Item1 x.Item2。而不是 (x.x and x.y) 你知道这是否会改变吗?
  • 安装包“System.ValueTuple”-IncludePrerelease
  • 嗯,4.6.2 里好像没有。
  • 适用于 4.6.2,但仍然需要这个包。
  • 在 .NET 4.7 中,本机包含该包。
【解决方案2】:

它是.NET Framework 4.7 的一部分。

只要您不针对上述框架或更高版本(或.NET Core 2.0 / .NET Standard 2.0),您就需要引用ValueTuple。通过添加 System.ValueTuple NuGet Package 来做到这一点

【讨论】:

  • 我刚刚尝试使用 .net 4.7 并没有成功? System.ValueTuple`2 未找到
  • 我已经安装了 .net Framework 4.7 和 Visual Studio 的目标包。我还在下拉列表中选择了 4.7 版本,但它仍然无法编译。
  • 好的,我刚刚发现了问题:DLL System.ValueTuple 被硬编码在我的项目文件 (csproj) 中。从项目文件中删除此条目修复了问题。
  • 很好的解决方案,但您可能会添加更多细节。就我而言,System.ValueTuple.dll 仍在我的 bin 文件夹中。一旦我删除了它,我就可以走了。我的语言版本是default,一切正常。
【解决方案3】:

ValueTuple 类型内置于较新的框架中:

  • .NET 框架 4.7
  • .NET Core 2.0
  • 单声道 5.0
  • .Net Standard 2.0

在您以这些较新的框架版本之一为目标之前,您需要引用 ValueTuple 包。

更多详情http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html

【讨论】:

    【解决方案4】:

    对于 Visual Studio Code,使用内置的 Terminal 并运行:

    dotnet add package "System.ValueTuple"
    

    之后别忘了运行dotnet restore

    【讨论】:

    • 我无法让它在 VS Code 中工作。
    • 注意:不要在 .Net 4.7 上这样做
    【解决方案5】:

    确保您已安装 VS 的 .NET 4.6.2 Developer Pack,然后从 NuGet 中拉入 System.ValueTuple 包。

    【讨论】:

    • 即使使用 .NET 4.6.2,它似乎仍然需要 System.ValueTuple 包。
    • @mrsundquist,是的,低于 4.7
    【解决方案6】:

    如果其他人有同样的问题,我在将项目更新到 4.7 后遇到了这个错误。奇怪的是,我必须删除 System.ValueTuple 引用才能消除此错误。

    【讨论】:

      【解决方案7】:

      当我从 .NET 4.6.2 升级到 .NET 4.7.2 时,我也遇到了这个问题。不幸的是,我无法删除对 System.ValueTuple 的包引用,因为我使用的另一个 NuGet 包依赖于它。

      最后我找到了根本原因:项目文件夹中有一个 .NET 4.6.2 版本的mscorlib.dll(发布操作的输出),MSBuild 决定引用这个程序集而不是官方的.NET 4.7.2 参考程序集位于C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2

      由于 .NET 4.7 中引入了 System.ValueTuple,MSBuild 编译失败,因为它在 .NET 4.6.2 的引用程序集中找不到类型。

      (与https://stackoverflow.com/a/57777123/128709 重复)

      【讨论】:

        【解决方案8】:

        我不建议将 ValueTuple 添加为 .net Framework 项目的包引用。如您所知,此程序集可从 4.7 .NET Framework 获得。

        在某些情况下,您的项目会不惜一切代价尝试从 .NET Framework 文件夹而不是包文件夹中包含 ValueTuple,这可能会导致某些程序集未找到错误。

        我们今天在公司遇到了这个问题。我们有 2 个项目的解决方案(我过于简单化了):

        • Lib
        • Web

        Lib 包含 ValueTuple,Web 使用 Lib。事实证明,由于某种未知原因,Web 在尝试解析ValueTuple 的路径时将HintPath 放入.NET Framework 目录中,并且版本不正确。我们的应用程序因此而崩溃。 ValueTuple 未在 .csprojWebHintPath 中为该程序集定义。这个问题非常奇怪。通常它会从包文件夹中复制程序集。这次不正常。

        对我来说,添加System.* 包引用总是有风险的。它们通常就像定时炸弹。它们一开始很好,在最糟糕的时刻它们会在你的脸上爆炸。我的经验法则:如果没有真正需要,不要将System.* Nuget 包用于 .NET Framework

        我们通过手动将ValueTuple 添加到Web 项目内的.csproj 文件中解决了我们的问题。

        【讨论】:

          【解决方案9】:

          我必须检查 System.ValueTuple.dll 文件是否受源代码控制并更正其在 .cssproj 文件中的引用:

          1. 右键单击解决方案中的每个项目
          2. 卸载项目
          3. 编辑 .cssproj 文件:更改

          ....\ProjectName\ProjectName\obj\Release\Package\PackageTmp\bin\System.ValueTuple.dll

          提示路径>

          进入

          ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll

          提示路径>

          1. 保存更改并重新加载项目
          2. 找到 System.ValueTuple.dll 并将其保存到此文件夹中
          3. 将此文件的引用添加到源代码管理中

          (可选):7. 用这种方式解决另一个 .dll 文件的相同问题

          【讨论】:

          • 硬编码固定文件路径(或任何字符串)从来都不是一个好的解决方案。
          【解决方案10】:

          我们在一个针对 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 重新启动并多次删除相同的文件夹。从字面上看,没有任何效果。

          我不得不重构以使用结构。我希望其他人以后不要再遇到这个问题,但我认为如果你最终像我们一样陷入困境,这可能会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-08-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-23
            • 1970-01-01
            • 2015-09-22
            相关资源
            最近更新 更多