2012-10-02 24 views
7

पर आधारित अनुमान टाइप करें मैं एक सामान्य फ़ंक्शन लिखने की कोशिश कर रहा हूं जो मिलान पैरामीटर प्रकार स्वीकार करता है।
डेल्फी सादे तर्कों के साधारण मामले में सही प्रकार के पैरामीटर का अनुमान लगाता है।जेनेरिक तर्क प्रकार (डेल्फी)

जैसे:

type 
    TFoo = class 
    function Pair<T>(e1, e2: T): TList<T>; 
    end; 

aFoo.Pair(1, 2); काम करता है बिल्कुल ठीक के साथ इस फोन कर, लेकिन जब मैं एक सामान्य प्रकार

type 
    TFoo = class 
    function InsertInto<T>(aList: TList<T>; aVal: T): TList<T>; 
    end; 

पैरामीटर हस्ताक्षर बदल सकते हैं और कोशिश यह कॉल करने के लिए
aFoo.InsertInto(TList<String>.Create, 'bar');

तब संकलक इसके बारे में शिकायत करता है:
E2010 Incompatible types: 'Generics.Collections.TList<uTest.TFoo.InsertInto.T>' and 'Generics.Collections.TList<System.String>'

क्या कोई तरीका है कि मैं इसे (या एक समान) विधि लिख सकता हूं, ताकि क्लाइंट को टाइप पैरामीटर को specity नहीं करना पड़े?
aFoo.InsertInto<String>(TList<String>.Create, 'bar');

+0

मुझे लगता है कि त्रुटि संदेश आपको एक सुराग देता है जो अनुमान लगाता है कि यह काम यहां नहीं किया जा रहा है। क्यू –

+0

के शीर्ष पर सरल उदाहरण की तुलना में यह कंपाइलर की अनुमान प्रणाली के लिए स्पष्ट रूप से एक कठिन समस्या है। एवल बनाने की कोशिश करें: टी पहला पैरामीटर, शायद यह कंपाइलर को आसान बना देगा, लेकिन मौका बहुत खराब है –

+0

"स्ट्रिंग को प्रतिस्थापित करें "स्ट्रिंग" के साथ और E2010 असंगत प्रकारों का आनंद लें: 'System.Generics.Collections.TList ' और 'बूलियन' –

उत्तर

5

मेरा अनुमान है कि डेल्फी की दृढ़ता से टाइप की गई प्रकृति से आता है।
uTest.TFoo.InsertInto.TSystem.String के बराबर है लेकिन यह वास्तव में एक अलग प्रकार है।

बहुत इस उदाहरण की तरह जहां Int1 और Int2 एक ही प्रकार के नहीं हैं:

var 
    Int1: array[1..10] of Integer; 
    Int2: array[1..10] of Integer; 
     ... 
    Int1 := Int2; // <== BOOM! E2008 Incompatible types (in XE2) 

वास्तविक समस्या प्रकार निष्कर्ष के साथ लेकिन प्रकार पास्कल/डेल्फी के सख्त नियमों के अनुसार संगत नहीं होने के साथ नहीं है ।

+1

यह बहुत सराहनीय लगता है। एक मामूली नाइट-पिक। आप किस बारे में बात कर रहे हैं वह मजबूत/कमजोर प्रकार के सिस्टम की बजाय पहचान और संगतता टाइप करें। –

+2

यह भी हो सकता है कि स्ट्रिंग शब्दशः 'बार' का प्रकार 'System.String' नहीं है - कम से कम अभी तक नहीं। एक स्ट्रिंग अक्षर का प्रकार तरल पदार्थ है; संकलक इसे जो भी प्रकार की आवश्यकता है उसे निर्दिष्ट करता है, कम से कम जब यह जानता है कि उसे किस प्रकार की आवश्यकता है। इस बारे में सोचें कि समान स्ट्रिंग अक्षर को यूनिकोडरहर, पेंसिहर, वाइडस्ट्रिंग, या शॉर्टस्ट्रिंग के रूप में कैसे पारित किया जा सकता है, सभी कोड में एक ही पाठ से। तो हो सकता है कि 'uTest.TFoo.InsertInto.T' वास्तव में आधे दर्जन विभिन्न प्रकारों का प्रतिनिधित्व करता है, और संकलक "सर्वश्रेष्ठ" चुनने में असमर्थ है। –

+0

यह इंटीजर अक्षरों के साथ भी काम नहीं करता है, हालांकि इसका एक ही कारण हो सकता है (बाइट बनाम इंटीजर बनाम कार्डिनल)। –

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