2016-11-27 6 views
6

मैं इस page, जो आधिकारिक तौर पर दृश्य स्टूडियो 17 आर सी के release notes में संदर्भित है पढ़ रहा था, यह कहा गया है:अधिभावी तरीके 7.0

ओवरलोडिंग अधिभावी के प्रयोजन के लिए छुपाएं, उसी प्रकारों और लंबाई के साथ-साथ उनके अंतर्निहित ValueTuple प्रकारों के tuples समकक्ष समझा जाता है। अन्य सभी मतभेद असीमित हैं।

किसी सदस्य को ओवरराइड करते समय इसे बेस सदस्य के मुकाबले या विभिन्न फ़ील्ड नामों के साथ टुपल प्रकारों का उपयोग करने की अनुमति है।

एक स्थिति है जहाँ एक ही फ़ील्ड नाम मेल नहीं खाने वाले क्षेत्रों आधार और व्युत्पन्न सदस्य हस्ताक्षर के बीच , एक चेतावनी द्वारा संकलक

बताया जाता है जब एक शॉट है कि देने के लिए उपयोग किया जाता है:

public abstract class Foo 
{ 
    public abstract void AbstractTuple((int a, string b) tuple); 

    public virtual void OverrideTuple((int a, string b) tuple) 
    { 
     Console.WriteLine($"First= {tuple.a} Second = {tuple.b}"); 
    } 
} 

public class Bar : Foo 
{ 
    public override void AbstractTuple((int c, string d) tuple) 
    { 
     Console.WriteLine($"First= {tuple.c} Second= {tuple.d}"); 
    } 

    public override void OverrideTuple((int c, string d) tuple) 
    { 
     base.OverrideTuple(tuple); 
    } 
} 

मैं निम्नलिखित त्रुटियाँ मिलती है: ((पूर्णांक

त्रुटि CS8139 'Bar.AbstractTuple ग, स्ट्रिंग घ)): Foo.AbstractTuple ' टपल तत्व नाम जब विरासत में मिला सदस्य अधिभावी नहीं बदल सकते' ((क, ख स्ट्रिंग int)) '

और

त्रुटि CS8139' बार .OverrideTuple ((पूर्णांक ग, स्ट्रिंग घ)): Foo.OverrideTuple 'जब विरासत में मिला सदस्य अधिभावी टपल तत्व नाम नहीं बदल सकते' ((एक int, स्ट्रिंग ख)) '

प्रश्न हैं:

  1. क्या आधिकारिक डिजाइन नोट्स गलत है? या यह ऐसा व्यवहार है जिसे अभी तक आधिकारिक सी # 7.0 रिलीज में लागू किया जाना है?

  2. यदि यह सही व्यवहार है, तो क्या यह समझ में आता है कि टुपल फील्ड नाम ओवरराइड विधि में समान होना चाहिए? ध्यान में रखते हुए कि एक ही टुपल्स (int a, int b) और (int c, int d) के साथ दो विधियों को ओवरलोड उम्मीदवार नहीं माना जाता है और एक त्रुटि उत्पन्न होती है!

  3. क्या हमारे पास कहीं भी आधिकारिक सी # 7.0 विशेषताएं प्रलेखन हैं?

+0

आपके द्वारा देखे जाने वाले व्यवहार सही हैं। मुझे याद नहीं है कि कौन सा एलडीएम उस निर्णय को शामिल करता है। लेकिन मैं अगले सप्ताह या दो में फीचर डिज़ाइन अपडेट करूंगा। Https://github.com/dotnet/roslyn/blob/master/docs/features/tuples.md –

+0

FWIW पर ट्यून किए रहें, मुझे 'System.ValueTuple' का उपयोग करने वाली नकली असेंबली उत्पन्न करने का प्रयास करते समय यह त्रुटि दिखाई दे रही है। –

उत्तर

3

आधिकारिक डिजाइन गलत नोट्स है? या यह ऐसा व्यवहार है जिसे अभी तक आधिकारिक सी # 7.0 रिलीज में लागू किया जाना है?

जहां तक ​​मैं कह सकता हूं, दस्तावेज़ीकरण पुराना है। That document hasn't significantly changed since April 2016, जबकि आपको मिली त्रुटि (ERR_CantChangeTupleNamesOnOverride Roslyn स्रोत में) was introduced in August 2016 (बाद में अलग-अलग त्रुटि कोड से उलझन में नहीं है)।

यदि यह सही व्यवहार है, तो क्या यह समझ में आता है कि टुपल फील्ड नाम ओवरराइड विधि में समान होना चाहिए? यह मानते हुए कि एक ही टुपल्स (int a, int b) और (int c, int d) के साथ दो विधियों को ओवरलोड उम्मीदवार नहीं माना जाता है और एक त्रुटि उत्पन्न होती है!

हां, यह नया इरादा व्यवहार प्रतीत होता है।

क्या हमारे पास कहीं भी आधिकारिक सी # 7.0 विशेषताएं प्रलेखन हैं?

ध्यान में रखते हुए कि सी # 7.0 अभी भी विकास में है, दस्तावेज़ीकरण एक मुद्दा है। आधिकारिक .NET प्रलेखन is currently under review में tuples के बारे में एक लेख, हालांकि यह इन मुद्दों का बिल्कुल उल्लेख नहीं करता है।

तो, आपके द्वारा पाया गया पुराना दस्तावेज़ शायद अब का सबसे अच्छा स्रोत है। I have created an issue asking for the documentation to be updated.

+0

कोई विचार क्यों यह निर्णय लिया गया था? मुद्दों पर वापस जाने और इसे जांचने का प्रयास किया, लेकिन ऐसा कारण प्रतीत नहीं होता है। क्या कोई मुद्दा था? – user3185569

+0

मुझे कुछ भी नहीं मिला। पीआर का उल्लेख है "एलडीएम 7/15", लेकिन [उस तारीख के लिए डिजाइन नोट्स] (https://github.com/dotnet/roslyn/issues/12939) इस बारे में बात न करें। – svick

संबंधित मुद्दे