विज़ुअल स्टूडियो 2017 और सी # 7.0 का उपयोग करके एक विधि से टपल को वापस करने में असमर्थ


98

मैंने एक सप्ताह पहले रिलीज़ किया गया Visual Studio 2017 समुदाय स्थापित किया है, और मैंने 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 सुविधाओं का उपयोग करने के लिए अतिरिक्त सामान की आवश्यकता है, तो यह बहुत अजीब है कि हमें हर परियोजना के लिए ऐसा करने की आवश्यकता है?!


जवाबों:


129

I बस रोसलिन पर इस पृष्ठ के माध्यम से भाग गया जिसमें इस कार्य को प्राप्त करने के लिए निम्नलिखित चरणों का वर्णन है:

  1. C # प्रोजेक्ट प्रारंभ करें
  2. System.ValueTuple पैकेज से एक संदर्भ जोड़ें NuGet (पूर्व-रिलीज़)

यहां छवि विवरण दर्ज करें

उन चरणों का पालन करते हुए, यह अब काम कर रहा है। लेकिन यह वास्तव में बहुत अजीब है कि हमें हर एक परियोजना के लिए ऐसा करने की आवश्यकता है जो हम शुरू करते हैं! उम्मीद है कि यह तब तय होगा जब हम आधिकारिक रिलीज़ पर पहुँचेंगे!


2
एक चीज जो अगली रिलीज में होनी चाहिए वह एक कोड फिक्स है जिससे आप आसानी से पैकेज जोड़ सकते हैं।
svick

6
इस समाधान से मुझे मदद मिली; यहां तक ​​कि VS2017 प्रोफेशनल के पूर्ण रिलीज संस्करण के साथ, मार्च 2017 में डाउनलोड किया गया!
निज़

2
बहुत नाराज है कि यह आधिकारिक भाषा में नहीं है। इसे ठीक करने के साथ ही समस्या में भाग गया। वे इसे C # 7 भाषा सुविधा के रूप में विपणन कर रहे हैं जब वास्तव में यह C # 7 एक्सटेंशन सुविधा से अधिक है। मुझे लगता है कि जब आप नए रोसलिन कंपाइलर (जो मैं एक प्रशंसक हूं) का उपयोग कर रहे हैं, तो बाल इस तरह से प्राप्त कर सकते हैं ... किसी भी तरह, यह एक दुःखद पक्ष प्रभाव आईएमओ है।
माइकल पिकेट द्वितीय

10
@MichaelPuckettII मुझे लगता है कि यह इसलिए है क्योंकि इस सुविधा को .NET फ्रेमवर्क में मौजूद होने के लिए classe (s) की आवश्यकता है और उन्होंने अभी तक एक नया जारी नहीं किया है, इसीलिए इसे Nuget Package के रूप में शामिल करने के लिए एक अस्थायी समाधान था। जब अगला .NET फ्रेमवर्क जारी किया जाता है, तो इस सुविधा के लिए आवश्यक कक्षाएं पहले से ही अंतर्निहित होनी चाहिए। यदि नहीं, तो यह एक समस्या है जिसे कुछ स्पष्टीकरण की आवश्यकता है।
ज़ीन मक्की

11
.NET फ्रेमवर्क 4.7 में अपग्रेड करने के बाद मुझे यह त्रुटि मिली, ValueTuple अब 4.7 का हिस्सा है, इसलिए ट्यूपल पैकेज को अनइंस्टॉल करना मेरे लिए समाधान था
chad.mellor

50

मैं .Net 4.7 फ्रेमवर्क स्थापित करने के बाद मुझे यह त्रुटि मिलनी शुरू हो गई, और अपनी परियोजना को लक्ष्य .Net 4.7 में बदल दिया

ValueTuple को अब .Net 4.7 के साथ शामिल किया गया है, इसलिए आपको ValueTuple को मैन्युअल रूप से संदर्भित नहीं करना है।

संकलित त्रुटि को ठीक करने के लिए मुझे बस इतना करना था कि अपने प्रोजेक्ट के संदर्भ से System.ValueTuple का संदर्भ हटा दें।


1
महान, आपके सुझाव का पालन किया, अब इसे .NET 4.7 में शामिल किया गया है, इसे NuGet से इंस्टॉल करने की आवश्यकता नहीं है। धन्यवाद।
गेंगजुन वू

क्या हम उस .net का उपयोग पहले से कर सकते हैं। यह 2019 है। मैं .net 4.7.2 के लिए लक्ष्य करता हूं
user4951

2

जब मैं .NET 4.6.2 से .NET 4.7.2 में अपग्रेड हुआ तो मैं भी इस मुद्दे पर आया। दुर्भाग्य से, मैं पैकेज संदर्भ को हटाने में सक्षम नहीं था System.ValueTupleक्योंकि एक और NuGet पैकेज जो मैं उपयोग करता हूं वह इस पर निर्भर करता है।

अंत में मैं मूल कारण का पता लगाने में सक्षम था: mscorlib.dllप्रोजेक्ट फ़ोल्डर (एक प्रकाशन ऑपरेशन का आउटपुट) में चारों ओर .NET 4.6.2 संस्करण पड़ा था और 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 के संदर्भ असेंबली में प्रकार नहीं खोज सका।


1

.NET 4.7.2 को अपडेट करने के बाद भी मुझे यह त्रुटि मिली और इसे nuget संकुल को पुन: स्थापित करके इसे ठीक करने में सक्षम था:

Update-Package -Reinstall
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.