2012-01-23 15 views
5

संकलन निम्नलिखित कोड का टुकड़ा दिया गया है:TCustomAttribute - "लगातार अभिव्यक्ति की उम्मीद" त्रुटि

type 
    MyIntf = interface 
    ['{C6184693-663E-419F-B2DA-4DA1A0E33417}'] 
    procedure Foo; 
    end; 

    InvisiblePropInterfaces = class(TCustomAttribute) 
    private 
    FGUIDS: array of TGUID; 
    public 
    constructor Create(const GUIDS: array of TGUID); 
    end; 

    [InvisiblePropInterfaces([MyIntf])] // <-- Constant expression expected error 
    TMyClass = class(TInterfacedObject, MyIntf) 
    procedure Foo; 
    end; 

संकलक क्यों लगता है कि यह एक निरंतर अभिव्यक्ति नहीं है करता है? लेकिन यह देखते हुए कि मैं इस तरह InvisiblePropInterfaces का उपयोग करता हूं, संकलक बस खुश है?

... 
var 
    I: InvisiblePropInterfaces; 
begin 
    I:= InvisiblePropInterfaces.Create([MyIntf]); 
... 

उत्तर

6

attributes documentation की उचित अनुभाग यह है:

यह समझना महत्वपूर्ण है कि मूल्यों विशेषता के निर्माता के लिए पारित निरंतर भाव होना चाहिए महत्वपूर्ण है। चूंकि उन मानों को सीधे परिणामी बाइनरी में एम्बेड किया जाना चाहिए, इसलिए एक अभिव्यक्ति को पार करना असंभव है जिसके लिए रन-टाइम मूल्यांकन की आवश्यकता होती है। यह जानकारी के लिए कुछ सीमाएं बढ़ाता है जिसे संकलन समय पर विशेषता में पारित किया जा सकता है:

  • केवल स्थिर अभिव्यक्तियों को सेट, तार और सामान्य अभिव्यक्तियों सहित अनुमति दी जाती है।
  • आउट और var पैरामीटर का उपयोग नहीं किया जा सकता है, क्योंकि उन्हें पास पैरामीटर के पते के रन-टाइम मूल्यांकन की आवश्यकता होती है।
  • Addr() आंतरिक और @ ऑपरेटर का उपयोग नहीं किया जा सकता है।
  • टाइपइन्फो() ऑपरेटर का उपयोग प्रकार की जानकारी पास करने के लिए किया जा सकता है, क्योंकि आरटीटीआई ब्लॉक पते संकलित समय पर ज्ञात हैं।
  • कक्षा संदर्भों की अनुमति है, क्योंकि मेटाक्लास पते (TypeInfo() के मामले के रूप में) संकलन समय पर ज्ञात हैं।

प्रमुख मुद्दा है कि एक constant expression एक तकनीकी पास्कल शब्द है कि एक निरंतर रूप में एक ही बात नहीं है है। मुझे संदेह है कि यह भ्रम की जड़ है।

चूंकि एक निरंतर अभिव्यक्ति होना संभव नहीं है जिसे TGUID पर पारित किया जा सकता है, तो आप अपनी विशेषता के साथ भाग्य से बाहर हैं। वास्तव में यह एक निरंतर अभिव्यक्ति होना असंभव है जिसे एक खुले सरणी पैरामीटर में पारित किया जा सकता है।

मुझे लगता है कि आप conundrum को हल करने के लिए GUID के स्ट्रिंग प्रस्तुति का उपयोग कर सकते हैं, लेकिन यह आपको गंदे डुप्लिकेशन और GUID के सरणी पास करने में असमर्थता के साथ छोड़ देगा।

+0

ऐसा लगता है कि मैं गुणों के अपने पहले वास्तविक उपयोग के साथ भाग्य से बाहर हूं। खैर, तो मुझे अपना डिज़ाइन बदलना होगा और बस मेरी कक्षाओं को किसी अन्य इंटरफ़ेस से सजाना होगा, जैसे: IInvisiblePropInterfaces = इंटरफ़ेस फ़ंक्शन GetGuids: TGuid की सरणी – iamjoosy

-2

एर्म क्योंकि आप एक

TInvisiblePropInterfaces.Create (स्थिरांक GUIDs: TGUID की सरणी) की उम्मीद के लिए यह कहा था;

आपका विशेषता MyIntf

+1

कंपाइलर इंटरफ़ेस प्रकार से एक GUID पुनर्प्राप्त कर सकता है, इसलिए एक टीआईएल प्रकार की अपेक्षा होने पर इंटरफ़ेस प्रकार (यह देखते हुए कि यह एक GUID है) देने के लिए बिल्कुल कानूनी है। मेरा संपादित प्रश्न भी देखें। – iamjoosy

+0

विशेषता * अपेक्षित * इंटरफ़ेस के बारे में कुछ भी जानने के लिए नहीं है, * अभी तक *। यही कारण है कि यह एक पैरामीटर के रूप में प्रदान किया जाता है। और आपका तर्क समझ में नहीं आता है: संकलक शिकायत करता है कि कुछ * एक निरंतर अभिव्यक्ति नहीं है क्योंकि हमने इसे एक की उम्मीद करने के लिए कहा था?भले ही घोषणा * ने * स्थिर अभिव्यक्ति की उम्मीद करने के लिए संकलक को बताया (यह नहीं), केवल संकलक को यह बताने के लिए कहें कि किसी के लिए यह बताने के लिए पर्याप्त कारण नहीं है कि कुछ * एक * नहीं है। प्रश्न पूछता है कि क्यों संकलक सोचता है कि दी गई अभिव्यक्ति निरंतर नहीं है, क्यों संकलक निरंतर अभिव्यक्ति की अपेक्षा करता है। –

+0

क्षमा करें तुमने मुझे खो दिया। "क्यों कॉमेलर सोचता है कि यह स्थिर नहीं है"। भाग्यशाली अनुमान ?, यादृच्छिक संख्या जनरेटर, एक दोस्त को फोन किया, या हो सकता है, बस कुछ हो सकता है, कहीं किसी ने कहा कि यह एक नहीं था ...... –

1

यह एक ज्ञात सीमा है के बारे में कुछ नहीं जानता है। TGUID को रिकॉर्ड प्रकार के रूप में घोषित किया गया है और रिकॉर्ड निरंतर अभिव्यक्ति करने का कोई तरीका नहीं है।

+1

सच नहीं है। आप बिना किसी समस्या के InvisiblePropInterfaces.Create ([MyIntf]) को कॉल कर सकते हैं। ऐसा लगता है कि इसके गुण संदर्भ में यह संकलित नहीं करता है। – iamjoosy

+1

जब आप इसे मैन्युअल रूप से कॉल करते हैं, तो इसे अब निरंतर अभिव्यक्ति नहीं होना चाहिए। –

+0

@ रोब, लेकिन ([MyIntf]) निरंतर अभिव्यक्ति नहीं है? – iamjoosy

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