ไม่สามารถคืนค่า Tuple จากวิธีการโดยใช้ Visual Studio 2017 และ C # 7.0


102

ฉันได้ติดตั้ง Visual Studio 2017 Community ที่เปิดตัวเมื่อสัปดาห์ที่แล้วและฉันเริ่มสำรวจคุณสมบัติใหม่ของ C # 7

ดังนั้นฉันจึงสร้างวิธีง่ายๆที่คืนค่าสองค่า:

public class Program
{
    public static void Main(string[] args)
    {
        (int sum, int count) a = ReturnTwoValues();
    }

    static (int sum, int count) ReturnTwoValues() => (1, 1);
}

คอมไพเลอร์กำลังสร้างข้อผิดพลาด:

ข้อผิดพลาด CS8137 ไม่สามารถกำหนดคลาสหรือสมาชิกที่ใช้ทูเปิลได้เนื่องจากไม่พบคอมไพเลอร์ประเภท 'System.Runtime.CompilerServices.TupleElementNamesAttribute' คุณขาดข้อมูลอ้างอิงหรือไม่?

ฉันพยายามค้นหาข้อมูลอ้างอิงในกรอบที่มีชื่อนี้ แต่โชคไม่ดี!

ถ้าเราต้องการอะไรเพิ่มเติมเพื่อใช้ฟีเจอร์ C # 7.0 ล่ะก็แปลกมากที่ต้องทำแบบนั้นกับทุกโปรเจ็กต์?!


คำตอบ:


130

ฉันเพิ่งผ่านหน้านี้ในRoslynซึ่งอธิบายขั้นตอนต่อไปนี้เพื่อให้ได้ผล:

  1. เริ่มโครงการ C #
  2. เพิ่มข้อมูลอ้างอิงไปยังSystem.ValueTuple แพ็คเกจจาก NuGet (ก่อนวางจำหน่าย)

ป้อนคำอธิบายภาพที่นี่

ทำตามขั้นตอนเหล่านั้นตอนนี้ใช้งานได้แล้ว แต่มันแปลกมากที่เราต้องทำแบบนั้นกับทุกๆโปรเจ็กต์ที่เราเริ่ม! หวังว่าจะได้รับการแก้ไขเมื่อถึงรุ่นอย่างเป็นทางการ!


2
สิ่งหนึ่งที่ควรมีในรุ่นถัดไปคือการแก้ไขรหัสที่ช่วยให้คุณเพิ่มแพ็คเกจได้อย่างง่ายดาย
svick

7
วิธีนี้ช่วยฉัน; แม้จะมี VS2017 Professional เวอร์ชันเต็มซึ่งดาวน์โหลดในเดือนมีนาคม 2017!
นิจ

2
รำคาญมากที่นี่ไม่ใช่ภาษาราชการ พบปัญหาเดียวกันกับการแก้ไขปัญหานี้ พวกเขากำลังทำการตลาดนี้เป็นคุณลักษณะภาษา C # 7 ในความเป็นจริงแล้วคุณลักษณะส่วนขยาย C # 7 มีมากกว่า ฉันเดาว่าสิ่งต่าง ๆ อาจมีขนดกเช่นนั้นเมื่อคุณใช้คอมไพเลอร์ Roslyn ใหม่ (ซึ่งฉันเป็นแฟนตัวยง) ... ไม่ว่าจะด้วยวิธีใดนี่เป็นผลข้างเคียงที่น่าเศร้า IMO
Michael Puckett II

10
@MichaelPuckettII ฉันคิดว่าเป็นเพราะคุณลักษณะนี้ต้องการ classe เพื่อให้มีอยู่ในกรอบงาน. NET และพวกเขายังไม่ได้เปิดตัวใหม่นั่นเป็นเหตุผลว่าทำไมวิธีแก้ปัญหาชั่วคราวจึงรวมสิ่งนี้เป็นแพ็คเกจ Nuget เมื่อเฟรมเวิร์ก. NET ถัดไปถูกเผยแพร่คลาสที่จำเป็นสำหรับฟีเจอร์นี้ควรมีอยู่แล้วในตัว ถ้าไม่เช่นนั้นนั่นคือปัญหาที่ต้องการคำอธิบาย
Zein Makki

13
หลังจากเพิ่งอัปเกรดเป็น. NET Framework 4.7 ฉันได้รับข้อผิดพลาดนี้ปรากฎว่าตอนนี้ ValueTuple เป็นส่วนหนึ่งของ 4.7 ดังนั้นการถอนการติดตั้งแพ็คเกจ tuple จึงเป็นทางออกสำหรับฉัน
chad.mellor

59

ฉันเริ่มได้รับข้อผิดพลาดนี้หลังจากติดตั้ง. Net 4.7 Framework และเปลี่ยนโปรเจ็กต์ของฉันเป็นเป้าหมาย. Net 4.7

ขณะนี้ ValueTuple รวมอยู่ใน. Net 4.7 แล้วดังนั้นคุณไม่จำเป็นต้องอ้างอิง ValueTuple ด้วยตนเอง

สิ่งที่ฉันต้องทำเพื่อแก้ไขข้อผิดพลาดในการคอมไพล์คือลบการอ้างอิงถึง System.ValueTuple ออกจากการอ้างอิงโครงการของฉัน


1
เยี่ยมมากทำตามคำแนะนำของคุณตอนนี้รวมอยู่ใน. NET 4.7 แล้วไม่จำเป็นต้องติดตั้งจาก NuGet อีกต่อไป ขอบคุณ.
Gengjun Wu

เราสามารถใช้สิ่งนั้นบน. net ได้แล้ว มันคือปี 2019 ฉันกำหนดเป้าหมายเป็น. net 4.7.2
user4951

3

ฉันได้รับข้อผิดพลาดนี้เช่นกันหลังจากอัปเดตเป็น. NET 4.7.2 และสามารถแก้ไขได้โดยการติดตั้งแพ็คเกจ nuget ใหม่โดยใช้:

Update-Package -Reinstall

2

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

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