预定义类型 'System.ValueTuple`2' 未定义或未导入。

4
我有一个.NET解决方案文件,其中包含约20个C#项目。所有这些项目都是针对.NET Framework 4.6.2的。在几个项目中,我可以轻松地编写var t = ("hello", "world");代码,并且编译器会通过。但是,在同一解决方案的某些项目中,使用完全相同的代码时,编译失败并显示Predefined type System.ValueTuple`2 is not defined or imported
我已经检查了以下内容:
  • 解决方案或项目目录中没有mscorlib.dll
  • binobj已经被多次删除。
  • 同事的计算机上也能重现该问题。
  • 没有一个项目使用NuGet包System.ValueTuple
  • 我在所有*.csproj文件中进行了文本搜索,但没有找到任何匹配项。
我知道有很多与此错误相关的文章,但大多数只是说:安装NuGet包或更新.NET Framework版本。不幸的是,它们似乎都没有涵盖我遇到的问题。除了安装或升级任何内容之外,我想了解这种行为。

2
在一些情况下,它以某种方式获取到对GAC中程序集或NuGet包的引用(可能是通过传递?)。但老实说,在net46*上使用值元组真的很麻烦,而且不值得因此而带来的痛苦。基本上可以说,除非你的目标是.net core,否则最好不要使用值元组。 - Marc Gravell
由于没有任何项目使用NuGet包,这不是一个选择。你怀疑GAC中存在对System.ValueTuple.dll的传递依赖关系? - mu88
1个回答

2

我终于找到了罪魁祸首:有一个针对.NET Standard 2.0的项目。每个引用.NET Standard项目的.NET Framework项目会自动从GAC中获取对System.ValueTuple.dll的引用(在我的情况下,这是.NET Framework 4.7.2)。
没有引用.NET Standard项目的每个项目都没有这个引用。因此,代码片段var t = ("hello", "world");不能使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接