2010-08-11 14 views
6

कुछ कोड में मैं ऊपर फिक्सिंग कर रहा हूँ, जो जेनरिक का भारी इस्तेमाल और interfaced प्रकार बनाता है, मैं त्रुटिडेल्फी कंपाइलर त्रुटि E2134 का अर्थ क्या है?

 E2134, Type '<void>' has no type info.

हो रही है मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि मैं एक refactor के बीच में हूं जहां से कुछ गहरा नेस्टेड सेट जेनिक्स का उपयोग करने वाली इकाइयां सिंक्रनाइज़ नहीं हैं, लेकिन त्रुटि ऐसी जगह पर नहीं हो रही है जहां मैं कोड को ठीक करने के लिए त्रुटि संदेश का उपयोग कर सकता हूं, क्योंकि कोड में कुछ भी गलत नहीं है, उस स्थान पर जहां त्रुटि दिखाई दे रही है ।

यहाँ, संदर्भ, मज़ाक उड़ाया है, क्योंकि मैं कोड पोस्ट नहीं कर सकते हैं, वहाँ बहुत अधिक है:

unit GenericThing; 
... 
interface 
... 
type 
... 
IThingListOf<ThingT> = interface(IThingContainer) 
    function getEnumerator: TEnumerator<ThingT>; 
    function getCount: Integer; 
    function getThing(Index: integer): ThingT; 
    function getFirst: ThingT; 
     function IndexOf(value: ThingT): integer; 
    function addItem(const Thing: ThingT): ThingT; 
     function removeItem(const Thing: ThingT): Integer; 
    procedure clear; 
    procedure Sort; overload; 
    procedure Sort(const AComparer: IComparer<ThingT>); overload; 
    property Count: integer read getCount; 
    property First: ThingT read getFirst; 
    property Items[Index: integer]: ThingT read getThing; default; 
    end; 

// error appears on whatever line number comes after the declaration of IThingListOf<ThingT>...end; 
    function AnythingYouLikeHere:Integer; // there is nothign wrong with this line, but you get the E2134 here. 

ऐसा लगता है कि समस्या IThingContainer में ही है:

IThingContainer = interface ... 
     ... 
     procedure DoSomething(const Param); 
    end; 

"कॉन्स परम" के ऊपर कोई प्रकार की जानकारी नहीं है। यह मेरी राय में पास्कल/डेल्फी का एक अजीब (बगल) है, जहां आप दृढ़ टाइपिंग के विर्थ के विचार का पूरी तरह से उल्लंघन करते हैं। यह सी में "शून्य *" सूचक के रूप में कमजोर रूप से टाइप किया गया है, या डेल्फी में "सूचक" प्रकार के रूप में टाइप किया गया है, लेकिन मानक पूर्व-ऑब्जेक्ट-पास्कल आरटीएल कार्यों जैसे मूव, और ऐसे स्थानों में छोड़कर इसे शायद ही कभी उपयोग किया जाता है। पर। मेरी राय में, जेनेरिक में इस्तेमाल इंटरफेस में अनियमित पैरामीटर, या तो अनुमति दी जा सकती है, या अस्वीकृत की जानी चाहिए, लेकिन कभी-कभी अनुमति नहीं दी जाती है, और अन्य बार अनुमति नहीं दी जाती है।

यह विशेष रूप से IThingContainer उपलब्ध की परिभाषा के बिना से 2009

उत्तर

15

त्रुटि संदेश का अर्थ है कि दिए गए प्रकार के लिए कोई प्रकार की जानकारी उपलब्ध नहीं है। ,

type 
    {$M+} 
    IThing = interface 
    procedure P(const X); 
    end; 
    {$M-} 
begin 
end. 

समस्या है, यह लगता है कि IThingListOf<>, या अपने पूर्वजों में से एक, {$M+} सक्रिय साथ संकलित किया गया है:

यहाँ एक न्यूनतम कार्यक्रम जो संदेश पैदा करता है। संकलक इस से मानता है कि आप वास्तव में इंटरफ़ेस के लिए पूर्ण प्रकार की जानकारी चाहते हैं; मूल रूप से इसका इस्तेमाल एसओएपी आदि द्वारा किया जाता था। स्टब्स आदि का उत्पादन करने के लिए समर्थन। इंटरफ़ेस आरटीटीआई अनियमित पैरामीटर का समर्थन नहीं करता है (तार्किक रूप से पर्याप्त है, उन्हें एसओएपी आदि द्वारा मार्शल नहीं किया जा सकता है) - और वे शून्य प्रकार के रूप में दिखाई देते हैं, और आप इस त्रुटि संदेश के साथ खत्म हो जाते हैं।

समाधान या तो {$M+} का उपयोग नहीं करना है - हालांकि संभवतः आरटीटीआई का उपयोग किया जा रहा है, अन्यथा यह सक्षम नहीं होगा - या उदाहरण का उपयोग करें। इसके बजाय Pointer, और पते को स्पष्ट रूप से पास करें।

+0

ब्रिलियंट। धन्यवाद। –

1

यह थोड़े इस से कहने के लिए, मुश्किल है एक ObjectPascal सुविधा के साथ बुरी तरह से मिश्रण 1978 से एक पास्कल सुविधा का एक मामला है। यदि आप इंटरफ़ेस परिभाषा को टिप्पणी करते हैं, तो क्या यह उस बिंदु से पहले संकलित होगा? जाहिर है जब आप इंटरफ़ेस लागू करने वाली कक्षा बनाने की कोशिश करते हैं तो यह टूट जाएगा, लेकिन को समस्या ठीक करने पर टिप्पणी कर रही है?

यदि ऐसा है, तो कंपाइलर इंटरफ़ेस परिभाषा में कुछ पर चकमा दे रहा है। समस्या का पता लगाने के लिए इसके कुछ हिस्सों पर टिप्पणी करने का प्रयास करें। यदि नहीं, तो आपको कहीं और देखना होगा।

+0

ऐसा तब होता है जब IThingContainer इंटरफ़ेस विधियों को परिभाषित करता है जिसमें कार्यों में अनियमित पैरामीटर होते हैं। वास्तव में अजीब बात यह है कि कभी-कभी आप कार्यों में अनियमित पैरामीटर को परिभाषित कर सकते हैं, और कुछ बार आप नहीं कर सकते हैं। मैं एक कोडबेस देख रहा हूं जो असीमित पैरामीटर का भारी उपयोग करता है।टाइप करने के लिए आईटिंगकॉन्टेनर में सभी पैरामीटर बदलना समस्या को हल करता है, लेकिन मुझे यह क्यों नहीं हो रहा है कि यह क्यों हो रहा है। –

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