'ValueTuple<T1, T2>'存在于'System.ValueTuple ...'和'mscorlib ...'



我正在尝试使用C#7的新元组功能,并遇到一些问题。实际上,他们的工作正常,我不确定是什么改变使他们断裂的原因。

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

因此,为了使用元组,我必须在nuget软件包'System.ValueTuple'上。没有它,该项目就不会编译。它工作了一段时间。然后,今天,当我加载任何使用元组的页面时,我会得到

编译器错误消息:CS0433:类型'valuetuple&lt; t1,t2&gt;'两者都存在于"系统"中,版本= 4.0.2.0,文化=中性,publicKeyToken = cc7b13ffcd2ddddddd51'和'mscorlib and Mscorlib,版本= 4.0.0.0,culture =中性,中性,public keyper = b77a5c561934e089'

该项目可以很好地编译,如果我删除System.ValueTuple,则不会编译。但是当我在网页中运行它时,我会收到此错误。

我在Google上的搜索表明ValueTuple已添加到.net 4.7中,但我在项目中的任何地方都没有引用4.7,也没有针对4.7编译。我的VS 2017甚至没有该选项。

asp.net网页在运行时编译,此编译忽略了VS使用的参考组件。如果.NET 4.7在运行时可用,则所有.NET 4.7的类型(包括其ValueTuple的定义)将与您可能从其他DLL中获得的任何其他定义一起拾取。

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

对于前者,您需要安装.NET 4.7目标包。它应该是Visual Studio Installer中的一个选项。当您这样做时,您可以避免使用ValueTuple Nuget软件包,从而冲突。

对于后者,您可以在发布Web项目时打开预编译。当您执行此操作时,通常在运行时发生的所有汇编都会在出版期间发生,以一种受控的方式,其中.NET 4.7的添加将不会看到。

i在我的wpf应用程序目标.NET 4.7.2中遇到了这个问题。我的测试项目使用SpecFlow,其依赖项之一是System.Valuetuple,因此我无法卸载它。因此,我所做的是删除项目的app.config文件中的Nuget软件包的引用。

删除:

<dependentAssembly>
     <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
     <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>

最新更新