ประเภทที่กำหนดไว้ล่วงหน้า 'System.ValueTuple´2´ ไม่ได้ถูกกำหนดหรือนำเข้า


385

ฉันได้ติดตั้ง Visual Studio 15 Preview 3 แล้วและพยายามใช้คุณสมบัติ tuple ใหม่

static void Main(string[] args)
{
    var x = DoSomething();
    Console.WriteLine(x.x);
}

static (int x, int y) DoSomething()
{
    return (1, 2);
}

เมื่อฉันรวบรวมฉันได้รับข้อผิดพลาด:

ประเภทที่กำหนดไว้ล่วงหน้า 'System.ValueTuple´2´ ไม่ได้ถูกกำหนดหรือนำเข้า

ตามการโพสต์บล็อกคุณสมบัตินี้ควรเป็น "เปิด" โดยค่าเริ่มต้น

ฉันทำอะไรผิด?


3
ไม่มีใครรู้ว่าจำเป็นต้องมีแพ็คเกจ NuGet แม้ในปี 2017 กำหนดเป้าหมาย RTM 4.6.2? ดูเหมือนว่าคุณยังต้องการมันอยู่และฉันคาดหวังว่าคุณจะไม่อยู่ในเวอร์ชั่นสุดท้าย
dmeglio

คุณสามารถลองใช้ System.Tuple <int, int> แทนได้
Kevin Xiao

สำหรับฉันstackoverflow.com/a/46533630/4383425นี้เป็นทางออก
Andre

คำตอบ:


528

สำหรับ. 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 รวมถึงประเภทเหล่านี้


3
ขอบคุณ มันหมายความว่ามันจะทำงานกับ 4.6.2 หรือไม่? Debugger ยังคงแสดง x.Item1 x.Item2 แทนที่จะเป็น (xx และ xy) คุณรู้หรือไม่ว่าจะเปลี่ยน?
gsharp

2
ติดตั้งแพ็คเกจ "System.ValueTuple" -IncludePrerelease
Frison Alexander

14
ดูเหมือนว่าจะไม่อยู่ใน 4.6.2
binki

12
ใช้งานได้กับ 4.6.2 แต่ยังคงต้องการแพ็คเกจนี้อยู่
Elisabeth

8
ด้วย. NET 4.7 แพคเกจรวมอยู่ในตัว
Mafii

40

.NET Framework 4.7มันเป็นส่วนหนึ่งของ

ตราบใดที่คุณไม่ได้กำหนดเป้าหมายกรอบดังกล่าวข้างต้นหรือสูงกว่า (หรือ.NET Core 2.0/ .NET Standard 2.0) ValueTupleคุณจะต้องอ้างอิง ทำได้โดยการเพิ่มSystem.ValueTuple NuGet Package


1
ฉันเพิ่งลอง. net 4.7 และมันใช้งานไม่ได้? System.ValueTuple`2ไม่พบ
Bidou

ฉันติดตั้ง. net Framework 4.7 และชุดเป้าหมายสำหรับ Visual Studio ฉันยังเลือกเวอร์ชัน 4.7 ในรายการดรอปดาวน์ แต่ก็ยังไม่ได้รวบรวม
Bidou

10
ตกลงฉันเพิ่งพบปัญหา: dll System.ValueTuple ถูก hardcoded ในไฟล์โครงการของฉัน (csproj) การลบรายการนี้ออกจากไฟล์โครงการช่วยแก้ไขปัญหา
Bidou

ทางออกที่ดี แต่คุณอาจเพิ่มรายละเอียดเพิ่มเติม ในกรณีของฉัน System.ValueTuple.dll ยังคงอยู่ในโฟลเดอร์ bin ของฉัน เมื่อฉันลบที่ฉันดีไป เวอร์ชันภาษาของฉันอยู่ที่defaultและทุกอย่างทำงานได้
toddmo

13

ValueTuple ถูกสร้างขึ้นในเฟรมเวิร์กที่ใหม่กว่า:

  • .NET Framework 4.7
  • .NET Core 2.0
  • โมโน 5.0
  • .Net Standard 2.0

จนกว่าคุณจะกำหนดเป้าหมายหนึ่งในเวอร์ชันเฟรมเวิร์กที่ใหม่กว่าเหล่านั้นคุณต้องอ้างอิงแพ็คเกจ ValueTuple

รายละเอียดเพิ่มเติมได้ที่http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html


5

สำหรับรหัส Visual Studioใช้เทอร์มินัลในตัวและเรียกใช้:

dotnet add package "System.ValueTuple"

อย่าลืมเรียกใช้ในdotnet restoreภายหลัง


ฉันไม่สามารถทำให้มันทำงานได้ใน VS Code
JonathanPeel

10
หมายเหตุ: อย่าทำเช่นนี้กับ. Net 4.7
toddmo

3

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง. NET 4.6.2 Developer Packสำหรับ VS แล้วดึงSystem.ValueTupleแพ็คเกจจาก NuGet


2
แม้ด้วย NET 4.6.2 ดูเหมือนว่ายังคงต้องการแพ็คเกจ System.ValueTuple
HaveSpacesuit

3
@mrsundquist มีอะไรที่ต่ำกว่า 4.7
toddmo

3

ในกรณีที่ผู้อื่นมีปัญหาเดียวกันฉันพบข้อผิดพลาดนี้หลังจากอัปเดตโปรเจ็กต์เป็น 4.7 ผิดปกติพอฉันต้องลบการอ้างอิง System.ValueTuple สำหรับข้อผิดพลาดนี้จะหายไป


3

ฉันจะไม่แนะนำให้เพิ่ม ValueTupleเป็นการอ้างอิงแพ็คเกจกับโครงการ. net Framework ตามที่คุณทราบแอสเซมบลีนี้พร้อมใช้งานจาก 4.7 .NET Framework

อาจมีบางสถานการณ์เมื่อโครงการของคุณพยายามที่จะรวมค่าใช้จ่ายทั้งหมด ValueTupleจากโฟลเดอร์. NET Framework แทนที่จะเป็นโฟลเดอร์แพคเกจและอาจทำให้แอสเซมบลีบางอย่างไม่พบข้อผิดพลาด

เรามีปัญหานี้ใน บริษัท วันนี้ เรามีวิธีแก้ปัญหาด้วย 2 โครงการ (ฉันเน้นเรื่องนั้นมาก):

  • Lib
  • Web

Libรวมถึง ValueTuple และWebกำลังใช้งานLibอยู่ มันกลับกลายเป็นว่าโดยไม่ทราบด้วยเหตุผลบางอย่างWebเมื่อพยายามที่จะแก้ปัญหาเส้นทางที่จะValueTupleได้มีHintPathลงในไดเรกทอรี .NET Framework และได้รับการรุ่นไม่ถูกต้อง แอปพลิเคชันของเราหยุดทำงานเนื่องจากสาเหตุดังกล่าว ValueTupleไม่ได้กำหนดไว้ใน.csprojการWebมิได้HintPathสำหรับการชุมนุมว่า ปัญหานั้นแปลกมาก โดยปกติจะคัดลอกแอสเซมบลีจากโฟลเดอร์แพคเกจ เวลานี้ไม่ปกติ

สำหรับฉันมันเป็นความเสี่ยงเสมอที่จะเพิ่มSystem.*การอ้างอิงแพ็คเกจ พวกเขามักจะชอบระเบิดเวลา พวกมันเริ่มต้นได้ดีและพวกมันสามารถระเบิดในหน้าของคุณในช่วงเวลาที่เลวร้ายที่สุด กฎง่ายๆของฉัน: อย่าใช้System.*แพคเกจ Nuget สำหรับ. NET Frameworkหากไม่จำเป็นต้องใช้พวกเขาจริงๆ

เราแก้ไขปัญหาของเราโดยการเพิ่มValueTupleลงใน.csprojไฟล์ภายในWebโครงการด้วยตนเอง


1

ฉันยังเจอปัญหานี้เมื่อฉันอัพเกรดจาก. 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ตั้งอยู่ในการชุมนุม

เนื่องจากข้อเท็จจริงที่ว่า System.ValueTuple ถูกนำมาใช้ใน. NET 4.7, MSBuild ล้มเหลวในการรวบรวมเนื่องจากไม่สามารถค้นหาชนิดในแอสเซมบลีอ้างอิงของ. NET 4.6.2

(ซ้ำจากhttps://stackoverflow.com/a/57777123/128709 )


0

ฉันต้องตรวจสอบไฟล์ System.ValueTuple.dll อยู่ภายใต้การควบคุมของแหล่งที่มาและแก้ไขการอ้างอิงในไฟล์. cssproj:

  1. คลิกขวาที่แต่ละโครงการในการแก้ปัญหา
  2. ยกเลิกการโหลดโครงการ
  3. แก้ไขไฟล์. cssproj: เปลี่ยนแปลง

<Reference Include = "System.ValueTuple">

<HintPath>

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

</ HintPath>

</ อ้างอิง>

เข้าไป

<Reference Include = "System.ValueTuple">

<HintPath>

.. \ แพคเกจ \ System.ValueTuple.4.4.0 \ lib \ netstandard1.0 \ System.ValueTuple.dll

</ HintPath>

</ อ้างอิง>

  1. บันทึกการเปลี่ยนแปลงและโหลดโครงการ
  2. ค้นหา System.ValueTuple.dll และบันทึกลงในโฟลเดอร์นี้
  3. เพิ่มการอ้างอิงของไฟล์นี้ลงในการควบคุมแหล่งที่มา

(ไม่บังคับ): 7. แก้ปัญหาเดียวกันกับไฟล์. dll อื่นด้วยวิธีนี้


1
การเข้ารหัสฮาร์ดพา ธ ไฟล์คงที่ (หรือสตริงใด ๆ ) ไม่ใช่วิธีที่ดี
Arghya C

0

เราพบปัญหาเดียวกันนี้ในหนึ่งในโครงการเก่าของเราที่กำหนดเป้าหมายใน 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 หลายครั้งและการลบโฟลเดอร์เดียวกันหลายครั้ง แท้จริงไม่มีอะไรทำงาน

ฉันต้องปรับโครงสร้างใหม่เพื่อใช้ struct แทน ฉันหวังว่าคนอื่นจะไม่พบปัญหานี้อีกในอนาคต แต่คิดว่าสิ่งนี้อาจเป็นประโยชน์หากคุณจบลงอย่างที่เคยเป็นมา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.