पूर्वनिर्धारित प्रकार 'System.ValueTuple´2 not परिभाषित या आयातित नहीं है


385

मैंने विजुअल स्टूडियो 15 प्रीव्यू 3 स्थापित किया है और नई ट्यूपल सुविधा का उपयोग करने की कोशिश की है

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

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

जब मैं संकलित करता हूं तो मुझे त्रुटि मिलती है:

पूर्वनिर्धारित प्रकार 'System.ValueTuple´2 not परिभाषित या आयातित नहीं है

ब्लॉग पोस्ट के अनुसार , यह सुविधाएँ डिफ़ॉल्ट रूप से "चालू" होनी चाहिए।

मैंने गलत क्या किया?


3
किसी को भी पता है कि क्या NuGet पैकेज की आवश्यकता है 2017 RTM लक्ष्य 4.6.2 में भी? ऐसा लगता है कि आपको अभी भी इसकी आवश्यकता है और मुझे उम्मीद थी कि आप अंतिम संस्करण में नहीं होंगे।
डेमेलियो

आप इसके बजाय System.Tuple <int, int> का उपयोग करने का प्रयास कर सकते हैं
केविन जिओ

मेरे लिए यह stackoverflow.com/a/46533630/4383425 समाधान था।
आंद्रे

जवाबों:


527

.NET 4.6.2 या उससे कम के लिए, .NET कोर 1.x और .NET मानक 1.x के लिए आपको NuGet पैकेज स्थापित करने की आवश्यकता है System.ValueTuple:

Install-Package "System.ValueTuple"

या वीएस 2017 में एक पैकेज संदर्भ का उपयोग कर:

<PackageReference Include="System.ValueTuple" Version="4.4.0" />

.NET फ्रेमवर्क 4.7, .NET कोर 2.0 और .NET मानक 2.0 में ये प्रकार शामिल हैं।


3
धन्यवाद। क्या इसका मतलब यह 4.6.2 के साथ काम करेगा? डीबगर अभी भी x.Item1 x.Item2 दिखाता है। इसके बजाय (xx और xy) क्या आप जानते हैं कि क्या परिवर्तन होगा?
gsharp

2
स्थापित-पैकेज "System.ValueTuple" -IncludePrerelease
Frison Alexander

14
खैर, यह 4.6.2 में नहीं लगता है।
बिंकी

12
4.6.2 के साथ काम करता है, अभी भी इस पैकेज की जरूरत है।
एलिजाबेथ

8
.NET 4.7 के साथ, पैकेज मूल रूप से शामिल है।
माफिया

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नहीं मिला
बिडू

मैंने .net फ्रेमवर्क 4.7 और विज़ुअल स्टूडियो के लिए लक्ष्य पैक स्थापित किया है। मैंने ड्रॉप डाउन में संस्करण 4.7 भी चुना था, लेकिन यह अभी भी संकलन नहीं करता है।
बिडू

10
ठीक है, मुझे अभी समस्या मिली है: dll System.ValueTuple को मेरी परियोजना फ़ाइल (csproj) में हार्डकोड किया गया था। प्रोजेक्ट फ़ाइल से इस प्रविष्टि को हटाने से समस्या ठीक हो गई।
बिडू

अच्छा समाधान, लेकिन आप अधिक विवरण जोड़ सकते हैं। मेरे मामले में, System.ValueTuple.dll अभी भी मेरे बिन फ़ोल्डर में लटका हुआ था। एक बार जब मैंने उसे हटा दिया, तो मुझे जाना अच्छा लगा। मेरा भाषा संस्करण है defaultऔर सभी काम कर रहे हैं।
टोडरमो

13

ValueTuple प्रकार नए फ्रेमवर्क में बनाए गए हैं:

  • .NET फ्रेमवर्क 4.7
  • .NET कोर 2.0
  • मोनो 5.0
  • .नेट स्टैंडर्ड 2.0

जब तक आप उन नए फ्रेमवर्क संस्करणों में से एक को लक्षित नहीं करते हैं, तब तक आपको ValueTuple पैकेज को संदर्भित करना होगा।

अधिक जानकारी के लिए http://blog.monstuff.com/archives/2017/03/valuetuple-avolution.html


5

के लिए दृश्य स्टूडियो कोड में बनाया का उपयोग टर्मिनल और चलाने:

dotnet add package "System.ValueTuple"

dotnet restoreबाद में चलाने के लिए मत भूलना ।


मैं वीएस कोड में काम करने के लिए इसे प्राप्त करने में सक्षम नहीं हूं।
JonathanPeel

10
नोट: .net 4.7
toddmo

3

सुनिश्चित करें कि आपके पास वी.एस. स्थापित के लिए .NET 4.6.2 डेवलपर पैक है और फिर System.ValueTupleNuGet से पैकेज में खींचें ।


2
.NET 4.6.2 के साथ भी अभी भी System.ValueTuple पैकेज की आवश्यकता है।
हैवस्पेसुइट

3
@ मर्सुंडक्विस्ट, हाँ कुछ भी नीचे 4.7
toddmo

3

यदि दूसरों की समस्या एक जैसी है, तो मैं 4.7 में प्रोजेक्ट अपडेट करने के बाद इस त्रुटि में भाग गया। अजीब तरह से, मुझे इस त्रुटि को दूर करने के लिए System.ValueTuple संदर्भ को हटाना पड़ा।


3

मैं ValueTuple.net फ्रेमवर्क परियोजनाओं के पैकेज संदर्भ के रूप में जोड़ने की सलाह नहीं दूंगा । जैसा कि आप जानते हैं कि यह असेंबली 4.7 .NET फ्रेमवर्क से उपलब्ध है।

कुछ परिस्थितियाँ हो सकती हैं जब आपकी परियोजना ValueTupleपैकेज फ़ोल्डर के बजाय .NET फ्रेमवर्क फ़ोल्डर से सभी लागतों को शामिल करने का प्रयास करेगी और यह कुछ असेंबली त्रुटियों का कारण नहीं बन सकती है।

कंपनी में आज हमें यह समस्या थी। हमारे पास 2 परियोजनाओं के साथ समाधान था (मैं इसकी देखरेख करता हूं):

  • Lib
  • Web

LibValueTuple सहित और Webउपयोग कर रहा था Lib। यह पता चला कि किसी अज्ञात कारण से Webजब करने के लिए संकल्प पथ करने की कोशिश कर ValueTupleरहा था HintPath.नेट फ्रेमवर्क निर्देशिका में और गलत संस्करण ले रहा था। उस वजह से हमारा एप्लिकेशन क्रैश हो रहा था। ValueTupleमें परिभाषित नहीं किया गया था .csprojकी Webहै और न ही HintPathहै कि विधानसभा के लिए। समस्या बहुत अजीब थी। आम तौर पर यह पैकेज फ़ोल्डर से असेंबली की प्रतिलिपि बनाता है। यह समय सामान्य नहीं था।

मेरे लिए System.*पैकेज संदर्भों को जोड़ना हमेशा जोखिम भरा होता है । वे अक्सर टाइम-बम की तरह होते हैं। वे शुरुआत में ठीक हैं और वे सबसे खराब क्षण में आपके चेहरे पर विस्फोट कर सकते हैं। मेरे अंगूठे का नियम: यदि उनके लिए कोई वास्तविक आवश्यकता नहीं है, तो .NET फ्रेमवर्क केSystem.* लिए Nuget पैकेज का उपयोग न करें ।

हमने प्रोजेक्ट के अंदर फ़ाइल ValueTupleमें मैन्युअल रूप से जोड़कर हमारी समस्या का समाधान किया ।.csprojWeb


1

मैं भी इस मुद्दे पर आया। जैसे ही मैंने .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 के संदर्भ असेंबली में प्रकार नहीं खोज सका।

( https://stackoverflow.com/a/57777123/128709 का डुप्लिकेट )


0

मुझे System.ValueTuple.dll फ़ाइल को स्रोत नियंत्रण में और उसके संदर्भ .cssproj फ़ाइलों को सही करने की जाँच करनी थी:

  1. समाधान में प्रत्येक परियोजना को राइट क्लिक करें
  2. उतराई परियोजना
  3. संपादन .cssproj फ़ाइल: परिवर्तन

<संदर्भ शामिल करें = "System.ValueTuple">

<हिंटपाथ>

.... \ ProjectName \ ProjectName \ obj \ रिलीज \ पैकेज \ PackageTmp \ बिन \ System.ValueTuple.dll

</ हिंटपाथ>

</ संदर्भ>

में

<संदर्भ शामिल करें = "System.ValueTuple">

<हिंटपाथ>

.. \ संकुल \ System.ValueTuple.4.4.0 \ lib \ netstandard1.0 \ System.ValueTuple.dll

</ हिंटपाथ>

</ संदर्भ>

  1. परिवर्तन सहेजें और परियोजनाओं को पुनः लोड करें
  2. System.ValueTuple.dll ढूंढें और इसे इस फ़ोल्डर में सहेजें
  3. स्रोत नियंत्रण में इस फ़ाइल का संदर्भ जोड़ें

(वैकल्पिक): 7. इसी तरह की अन्य समस्याओं के साथ .dll फ़ाइलों को हल करें


1
एक निश्चित फ़ाइल पथ (या किसी भी स्ट्रिंग) को कोडित करना एक अच्छा समाधान नहीं है।
अर्घ्य सी

0

हम अपने पुराने प्रोजेक्ट्स में इसी मुद्दे को देख रहे थे जो फ्रेमवर्क 4.5.2 को लक्षित कर रहा था। मैंने ऊपर सूचीबद्ध सभी सहित कई परिदृश्यों की कोशिश की: लक्ष्य 4.6.1, System.ValueTuple पैकेज जोड़ें, बिन, obj, और .vs फ़ोल्डर हटाएँ। कोई पाँसा नहीं। 4.7.2 के लिए एक ही प्रक्रिया को दोहराएं। तब मैंने System.ValueTuple पैकेज को हटाने की कोशिश की, क्योंकि मैं एक टिप्पणीकार के सुझाव के अनुसार 4.7.2 को लक्षित कर रहा था। अब तक कुछ भी नहीं। जाँच की गई csproj फ़ाइल संदर्भ पथ। सही लग रहा है। यहां तक ​​कि वापस 4.5.2 पर वापस गिरा और पैकेज को फिर से स्थापित किया। कई वी.एस. के साथ यह सब कई बार एक ही फ़ोल्डर को पुनरारंभ और डिलीट करता है। सचमुच कुछ भी काम नहीं किया।

मुझे इसके बजाय एक संरचना का उपयोग करने के लिए रिफ्लेक्टर करना पड़ा। मुझे आशा है कि अन्य लोग भविष्य में इस मुद्दे पर भागना जारी नहीं रखेंगे, लेकिन यह सोच सकते हैं कि अगर आप अंत में हम जैसे थे, तो यह मददगार हो सकता है।

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