2010-08-04 9 views
6

निम्नलिखित कोड का निरीक्षण करें:क्यों structs बाहरी गुण नहीं हो सकता है, लेकिन तरीकों ठीक है?

[AttributeUsage(AttributeTargets.All)] 
public class XAttribute : Attribute 
{ 
} 

public struct A 
{ 
    [X] 
    public static extern int XX { get; } 
} 

यह संकलित नहीं करता है। त्रुटि संदेश

संशोधक 'बाहरी' के लिए मान्य नहीं है

लेकिन, निम्न कोड ठीक संकलित करता है:

[AttributeUsage(AttributeTargets.All)] 
public class XAttribute : Attribute 
{ 
} 

public struct A 
{ 
    [X] 
    public static extern int GetXX(); 
} 

क्यों ???

संपादित करें

दोस्तों, दोस्तों। मैंने नहीं पूछा होगा कि मेरे पास इसके लिए असली आवेदन नहीं था। मैं समझता हूं कि पूरी तरह अकादमिक रुचि यह समझने के लिए कि क्यों कुछ चीजें परिभाषित की जाती हैं, वे कुछ ऐसा नहीं है जो हम में से कुछ को प्रेरित करती है, इसलिए यहां पृथ्वी की प्रेरणा है। मेरे पास PostSharp विशेषता है, जो जिम्मेदार बाहरी संपत्ति में एक निश्चित तर्क को इंजेक्ट करता है। विशेष रूप से, असली कोड ऐसा दिखता है:

[LoggerAccessProperty] 
private static extern ILog Logger { get; } 

जहां PostSharp LoggerAccessProperty पहलू को संसाधित करता है और वास्तविक गेटर विधि को इंजेक्ट करता है, जो निजी स्थैतिक संकलक उत्पन्न करता है जो आईएलओजी उदाहरण उत्पन्न करता है। यह Log4PostSharp पैकेज के हमारे इन-हाउस एक्सटेंशन का हिस्सा है। उस समय, हमने PostSharp Google कोड साइट पर Log4PostSharp का विस्तारित संस्करण प्रकाशित किया है और यह विशेषता मेरा हालिया जोड़ा है, फिर भी अप्रकाशित है।

EDIT2

नोट, कि निम्न कोड सिर्फ ठीक है:

[AttributeUsage(AttributeTargets.All)] 
public class XAttribute : Attribute 
{ 
} 

public class A 
{ 
    [X] 
    public static extern int XX { get; } 
} 

अंतर यह है कि ए यहां एक वर्ग है, संरचना नहीं।

EDIT3

मैं .NET 4.

का उपयोग कर रहा हूँ
+0

कक्षा ठीक से संकलित करती है, लेकिन बड़ा सवाल यह वास्तव में चलता है? –

+0

कृपया, प्रश्न के लिए मेरा पहला संपादन पढ़ें। – mark

उत्तर

1

extern गुण structs में अनुमति नहीं है।

+3

भाषा spec के लिए एक संदर्भ, कृपया। – mark

+0

@mark: मैंने वास्तव में कोशिश की, इसे नहीं मिला। मुझे लगता है कि यह कठोर संरचना नियमों के कारण था, लेकिन इसे उत्तर के हिस्से के रूप में नहीं रखा क्योंकि यह सुनिश्चित नहीं था। –

+0

अच्छा, तो यह एक उत्तर का अधिक नहीं है। मुझे पहले से ही पता है कि कक्षाओं के विपरीत, किसी संरचना में बाहरी गुण नहीं हो सकते हैं - मैंने इसे कठिन तरीके से पाया है। सवाल क्यों अनुत्तरित रहता है ... – mark

1

extern संशोधक लिए किया जाता है एक विधि कि बाहर से लागू किया गया है की घोषणा।

उपरोक्त बाहरी कीवर्ड के लिए दस्तावेज़ीकरण की पहली पंक्ति है। (जोर जोड़ा के साथ)। यह देखते हुए कि यह केवल विधियों (गुणों के लिए) पर लागू होता है, किसी को यह पूछना पड़ता है: आप क्या करने की कोशिश कर रहे हैं? तथ्य यह है कि यह एक वर्ग की बजाय एक संरचना है, और आपके कोड उदाहरणों में एक विशेषता की उपस्थिति दोनों लाल बालियां लगती हैं।

+0

बाहरी गुण कक्षाओं में ठीक हैं। –

+0

@Yuriy Faktorovich: कृपया कुछ कामकाजी नमूना कोड प्रदान करें। मुझे संदेह है कि सीएलआर इसे किसी भी रूप में लागू करता है। – leppie

+0

बेशक, प्रश्न अभी भी 'क्यों' है। अंततः गुण केवल विधियां हैं, जिन्हें get_XXX और set_XXX के रूप में संकलित किया गया है। तो उन्हें 'बाहरी' होने की अनुमति क्यों न दें? –

0

क्योंकि एक बाहरी विधि घोषणा कोई वास्तविक कार्यान्वयन प्रदान करता है, वहाँ कोई विधि शरीर है; विधि घोषणा केवल अर्धविराम के साथ समाप्त होती है और हस्ताक्षर के बाद कोई ब्रेसिज़ ({}) नहीं होती है।

तो अगर आप अपने कोड बदल दिया है:

[LoggerAccessProperty] 
private static extern ILog Logger(); 

यह अपने struct में ठीक काम करना चाहिए।

Reference Link

+0

हालांकि, बाहरी संपत्ति कक्षाओं के लिए बस ठीक है। आपका उत्तर न तो बाहरी गुणों के संबंध में संरचना और कक्षा के बीच कोई अंतर बताता है और न ही इंगित करता है, जबकि मैं जानता हूं और क्यों जाना चाहता हूं। – mark

+0

उपरोक्त आपका प्रश्न दो स्टुक्ट दिखाता है (मुझे संरचना बनाम वर्ग का कोई उल्लेख नहीं है)। Structs बनाम कक्षाओं में बाहरीों के हैंडलिंग के बीच कोई अंतर नहीं है। आपके पास बाहरी संपत्ति नहीं हो सकती है, क्योंकि बाहरी में कोई विधि नहीं है। एक संपत्ति (किसी भी रूप में) में एक विधि निकाय होता है (IE: {get; set;} या तो एक) बाहरी के साथ उपयोग करने के लिए इसे अमान्य बना देता है। संकलन भाग के लिए, यह बहुत अजीब है। –

+0

यह भी जानना अच्छा होगा कि आप किस ढांचे का उपयोग कर रहे हैं। यह सही दस्तावेज खोजने में मदद करेगा। बस केह रहा हू। –

0

यह संकलक में एक बग की तरह दिखता है (जिन्हें ठीक नहीं किया जाएगा)। संपत्ति एक्सेसर जेएसआईएल में विधियों के लिए संकलित हो जाता है, ताकि आप get_XXX विधि का उपयोग कर घूम सकें।

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