2012-11-21 17 views
9

डेल्फी एक्सई -2 का उपयोग (सभी अपडेट लागू)।मैं उस प्रकार के एक प्रकार के खुले सरणी पैरामीटर में एक प्रकार का एक्स क्यों पास कर सकता हूं?

मैं निम्नलिखित कोड को DoSomething और DoInteger कॉल पर संकलन त्रुटियों को उत्पन्न करने की अपेक्षा करता हूं, लेकिन ऐसा नहीं है। दोनों ही एकल चर, अपने-अपने प्रकार का एक खुला सरणी पैरामीटर के लिए [] के बीच और संकलक यह मुझ पर barfing अभी वापस बिना यह डाले बिना -

program OpenArrayQuestion; 

{$APPTYPE CONSOLE} 
{$R *.res} 

uses 
    System.SysUtils; 

type 
    IComposite = interface(IInterface) 
    ['{1AC3CF6A-1316-4838-B67B-9FB075585C1E}'] 
    end; 

    IComposite<T: IComposite> = interface(IComposite) 
    ['{7F866990-9973-4F8E-9C1F-EF93EF86E8F2}'] 
    end; 

function DoSomething(const aData: array of IComposite): Boolean; 
begin 
    Result := True; 
end; 

function DoInteger(const aData: array of Integer): boolean; 
begin 
    Result := True; 
end; 

var 
    FData: IComposite; 
    FInteger: Integer; 
begin 
    DoSomething(FData); 
    DoInteger(FInteger); 
end. 

किसी कारण है कि मैं FData/FInteger पारित कर सकते हैं व्याख्या कर सकते हैं?

मैंने सोचा कि इसे इंटरफेस की एक सरणी, या यहां तक ​​कि जेनेरिक भी शामिल हो सकता है, लेकिन कंपाइलर पूर्णांक की खुली सरणी में भी एक पूर्णांक को स्वीकार करता है।

उत्तर

7

कंपाइलर थोड़ा ढीला हो रहा है क्योंकि ऐसा करने में कोई अस्पष्टता नहीं है।

program OpenArrays; 

{$APPTYPE CONSOLE} 

procedure Test1(i: Integer); overload; 
begin 
    Writeln('Test1Integer'); 
end; 

procedure Test1(i: array of Integer); overload; 
begin 
    Writeln('Test1OpenArray'); 
end; 

procedure Test2(i: array of Integer); 
begin 
    Writeln('Test2'); 
end; 

var 
    i: Integer; 

begin 
    Test1(i); 
    Test1([i]); 
    Test2(i); 
    Readln; 
end. 

जो इस उत्पादन का उत्पादन:

 
Test1Integer 
Test1OpenArray 
Test2 

मैं Test1 अतिभारित किया है तो वहाँ एक संस्करण है कि एक पूर्णांक प्राप्त करता है, और एक संस्करण है कि एक खुले प्राप्त करता है कि

निम्नलिखित पर विचार करें पूर्णांक की सरणी। उस स्थिति में, कॉल Test1(i) ओवरलोड पर जाता है जो केवल एक पूर्णांक प्राप्त करता है। दूसरी तरफ, मैं Test2 पर कॉल कर सकता हूं जो एक पूर्णांक पास करके, एक खुली सरणी प्राप्त करता है।


मुझे विश्वास है कि यह व्यवहार language guide में प्रलेखित नहीं है। हालांकि, @hvd documentation for compiler error E2192 (जोर मेरा) में निम्न पाया:

ओपन सरणी तर्क एक वास्तविक सरणी चर, एक का निर्माण किया सरणी या तर्क के तत्व प्रकार के एकल चर के साथ आपूर्ति की जानी चाहिए।

+3

यह त्रुटि E2192 के लिए प्रलेखन में है: "ओपन सरणी तर्कों को एक वास्तविक सरणी चर, एक निर्मित सरणी या तर्क के तत्व प्रकार के एक चर के साथ आपूर्ति की जानी चाहिए।" मैं इसे दस्तावेज में नहीं देखता जहां मुझे यह खोजने की उम्मीद थी, हालांकि। – hvd

+1

ठीक है, मैं डर जाएगा ... धन्यवाद डेविड। और उस त्रुटि दस्तावेज को खोदने के लिए @hvd धन्यवाद। बिल्कुल ऐसी जगह नहीं है जहां आप ऐसी जानकारी ढूंढने की उम्मीद करेंगे। –

+1

@hvd अच्छी तरह से खेला वास्तव में। मुझे यह जानना अच्छा लगेगा कि पृथ्वी पर आपको यह कैसे मिला? –

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