2010-01-07 13 views
7

मुझे this question में वर्णित एक आंतरिक गेटर और संरक्षित सेटटर रखने की संपत्ति की समस्या हो रही थी, और मैंने सोचा कि मैंने हल किया है कि निम्नलिखित कार्य करके:सी # आंतरिक गेटर, एक आंतरिक वर्ग पैरामीटर के साथ संरक्षित सेटटर

public class Accessor : AccessorBase 
{ 
    private Connection _connection; 

    protected void setConnection(Connection value) 
    { 
     _connection = value; 
    } 

    internal Connection GetConnection() 
    { 
     return _connection; 
    } 
    ... 
} 

हालांकि, मैं अब इस त्रुटि हो रही है:

Inconsistent accessibility: parameter type 'Connection' is less accessible than method 'setConnection(Connection)'

इसका कारण यह है कि मैं internal class Connection है। मैं Connection सार्वजनिक कक्षा नहीं बनाऊंगा, जबकि Accessorको सार्वजनिक होने के लिए की आवश्यकता है, तो मैं आंतरिक त्रुटि और संरक्षित सेटटर को बनाए रखने के दौरान इस त्रुटि को कैसे प्राप्त कर सकता हूं?

उत्तर

2

...any protected members are visible outside the assembly and can't use an internal type.

- यह चारों ओर हो रही है की Pent Ploompuu's answer

एक तरह से Connection सार्वजनिक करना, जबकि अपने सभी उदाहरण के तरीकों और निर्माताओं के आंतरिक बना रही है।

+0

+1। .NET BCL में आप कभी-कभी किसी भी तरीके के बिना कक्षाएं देखते हैं: सब कुछ निजी या आंतरिक है। – Abel

+1

बस इस दीवार को मारा। यह एक पकड़ 22 है ... आप या तो अपनी आंतरिक कक्षाओं की दृश्यता की अनुमति देते हैं [लेकिन अन्यथा बाहरी दुनिया में खाली] या अन्य आंतरिक वर्गों को केवल कुछ व्युत्पन्न कक्षाओं को सेट करने की अनुमति देता है ... humnnnn ... –

1

यदि कक्षा कनेक्शन आंतरिक है, तो एक्सेसर प्राप्त करने वाला वर्ग संरक्षित सेटकनेक्शन को कॉल करने में सक्षम नहीं होगा क्योंकि उसके पास कनेक्शन तक पहुंच नहीं है।

यदि सेटकनेक्शन संरक्षित किया जाना है, तो कनेक्शन सार्वजनिक होना होगा।

+0

क्यों नहीं, अगर एक्सेसर से प्राप्त कक्षा उसी नामस्थान/प्रोजेक्ट में एक्सेसर और कनेक्शन दोनों के रूप में है? –

+2

"संरक्षित आंतरिक" का अर्थ है "संरक्षित" या "आंतरिक", जिसका अर्थ है कि यह केवल "संरक्षित" से कम प्रतिबंधित है। –

+0

@ सराह: सी # इस बात पर परवाह नहीं करता कि आप वर्तमान में कक्षा कहां प्राप्त कर रहे हैं। यह सब आपको बता रहा है कि आप एक सार्वजनिक वर्ग में एक संरक्षित कार्य करने की कोशिश कर रहे हैं जो आंतरिक वर्ग का उपयोग करता है। यह गैरकानूनी है क्योंकि आपकी सार्वजनिक कक्षा से प्राप्त किसी भी वर्ग के पास कनेक्शन तक पहुंच नहीं होगी। – Coincoin

8

दुर्भाग्य से सी # का समर्थन नहीं करता "आंतरिक और संरक्षित" पहुँच संशोधक (केवल "आंतरिक या संरक्षित" समर्थित है), जिसका अर्थ है किसी भी protected सदस्यों विधानसभा के बाहर दिखाई दे रहे हैं और एक आंतरिक प्रकार का उपयोग नहीं कर सकते हैं ।
internal का उपयोग protected के बजाय सबसे तार्किक समाधान होगा।

और आप vote at Microsoft Connect कर सकते हैं ताकि इसे C# किसी दिन जोड़ा जा सके।

+2

एचएम, मैं इसके आसपास हो सकता है 'कनेक्शन 'सार्वजनिक करके और बस इसके सभी उदाहरण विधियों और रचनाकारों को' आंतरिक 'बनाकर ... –

+0

हां, यह एक स्वीकार्य समाधान हो सकता है। –

+0

+1, यह स्पष्ट करने के लिए धन्यवाद कि, पेंट - मैं इसे पुराने गलत धारणा धागे में पोस्ट करूंगा यदि यह पहले से ही अधिक नहीं था। (मुझे यह थोड़ा सांत्वना मिली: http://haacked.com/archive/2007/10/29/what-does- संरक्षित-intern-mean.aspx, इसके अलावा इसमें एक दिलचस्प गूंज है जो बताता है कि सीएलआर समर्थन करता है और- दो दृश्यताएं; सी # में सिंटैक्स नहीं है।) –

0

क्षमा करें, अगर आपको उस सटीक सेटअप की आवश्यकता है, तो आपको अपना Connection क्लास सार्वजनिक बनाना होगा।

0

अनजाने में आप ऐसा नहीं कर सकते हैं। चूंकि Connection आंतरिक है किसी अन्य असेंबली से एक्सेसर से प्राप्त कुछ वर्ग Connection देखने में सक्षम नहीं होगा, भले ही आप सेटर को protected internal के रूप में चिह्नित करें, यह कुछ भी हल नहीं करेगा।

आपकी एकमात्र उम्मीद क्लास कनेक्शन सार्वजनिक बनाना है।

+0

इंटरफेस भी उनकी दूसरी आशा होगी .. :) –

+1

@Stan: और 'उसके' से आप 'उसका' मतलब है, है ना? ;) –

5

सार्वजनिक इंटरफ़ेस IConnection बनाएं जो आपके आंतरिक Connection ऑब्जेक्ट लागू करता है। अपने GetConnection और SetConnection विधियों को Connection के बजाय IConnection स्वीकार करें और वापस करें।

बेसिक SOLID सिद्धांत फिर से जीतते हैं।

+2

+1 यह * बिल्कुल * था जो मैं लिखने के बारे में था (साइड किक के बिना) ... – Abel

+1

+1 भयानक उत्तर .. मेरी मुस्कुराहट –

+2

और किस तरह के तरीकों/गुणों को 'आईकनेक्शन' की आवश्यकता होनी चाहिए? 'कनेक्शन' में जो भी सार्वजनिक तरीके हैं? –

0

Coincoin is correct, Accessor कोई सार्वजनिक वर्ग है जो किसी से प्राप्त कर सकता है, इसका मतलब है कि एक अलग असेंबली से भी। उस व्युत्पन्न वर्ग ने अब उस विधि को संरक्षित किया है जिस पर आपको आंतरिक (किसी अन्य असेंबली से) कक्षा उत्तीर्ण करने की आवश्यकता है। यह कभी काम नहीं करेगा।

आप का पालन Randolphos answer

यहाँ समस्या का एक कोड उदाहरण है या तो Accessor आंतरिक या Connection सार्वजनिक, बनाने या बेहतर अभी तक की जरूरत

विधानसभा 1

//this class is only visible in Assembly 1 
internal class Connection 
{ 

} 
public class Accessor 
{ 
    protected void SetConnection(Connection con) { } 
} 

विधानसभा 2 - संदर्भ है असेंबली 1

//possible because Accessor is public 
DerivedAccessor : Accessor 
{ 
    void SomeMethod() 
    { 
     this.SetConnection(????) // you can't pass Connection, its not visible to Assembly2 
    } 
} 
संबंधित मुद्दे