ไม่สามารถคืนค่า 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.