&#39; ValueTuple <t1,t2 =“”>&#39;存在于'System.ValueTuple ......&#39;和&#39; mscorlib ......&#39;

时间:2017-09-04 15:23:23

标签: c# asp.net asp.net-mvc c#-7.0

B&#34; H

我正在尝试使用C#7的新Tuple功能,并遇到一些问题。 实际上,他们工作正常,我不确定是什么改变让他们休息。

我正在使用ASP.Net 4MVC 5,定位.net framework 4.6.1

因此,为了使用元组,我必须使用Nuget Package 'System.ValueTuple'。没有它,项目就不会编译。它运作良好一段时间。然后今天当我加载任何使用元组的页面时我得到

  

编译器错误消息:CS0433:类型&#39; ValueTuple&#39;存在于System.ValueTuple,Version = 4.0.2.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51&#39;和&#39; mscorlib,版本= 4.0.0.0,文化=中立,PublicKeyToken = b77a5c561934e089&#39;

项目编译正常,如果我删除System.ValueTuple,那么它就不会编译。但是当我在网页上运行时,我收到了这个错误。

我在谷歌上的搜索建议将ValueTuple添加到.net 4.7,但我在项目的任何地方都没有引用4.7,而且我没有针对4.7进行编译。我的VS 2017甚至都没有这个选项。

谢谢

1 个答案:

答案 0 :(得分:6)

ASP.NET网页在运行时编译,此编译忽略VS使用的引用程序集。如果.NET 4.7在运行时可用,则所有.NET 4.7的类型(包括其ValueTuple的定义)将与您可能从其他DLL中获得的任何其他定义一起被选中。

如果您已经安装了.NET 4.7,最简单的避免此问题的方法是在开发环境中使用.NET 4.7,或者避免运行时编译。

对于前者,您需要安装.NET 4.7定位包。它应该是Visual Studio安装程序中的一个选项。当你这样做时,你可以避免ValueTuple NuGet包,从而避免冲突。

对于后者,您可以在发布Web项目时打开预编译。执行此操作时,通常在运行时发生的所有编译都会在发布期间以受控方式发生,而.NET 4.7的添加内容将无法使用。