2013-01-24 21 views
7

मैं निम्नलिखित (सी # .NET4) की तरह इंटरफेस के एक स्कीमा हैनेस्टेड जेनेरिक इंटरफेस

interface A 
{ 

} 

interface B 
{ 
    List<A> a; 
} 

interface C 
{ 
    List<B> b; 
} 

और मैं इसे इस तरह से लागू किया त्रुटि सामान्य प्रकार 'बी' का उपयोग करने के लिए 1 प्रकार के तर्कों की आवश्यकता होती है

+1

आप किसी भी इंटरफेस को लागू नहीं कर रहे हैं ... – Maarten

+0

मैंने गलत क्रिया का उपयोग किया :) .. मूल रूप से सभी एन्वर अच्छे हैं, सभी को धन्यवाद – Davide

उत्तर

7

चूंकि interface B<T> सामान्य है, तो आपको इसके लिए एक औपचारिक प्रकार तर्क प्रदान करना होगा interface C<T> घोषित करते समय। दूसरे शब्दों में, वर्तमान समस्या यह है कि आप संकलक को नहीं बता रहे हैं कि किस प्रकार का इंटरफ़ेस बी इंटरफ़ेस सी "विरासत" से है।

दो T एस आवश्यक रूप से एक ही प्रकार का संदर्भ नहीं लेंगे। वे एक ही प्रकार,

public interface C<T> where T : B<T>, A { ... } 

में के रूप में हो सकता है या वे दो भिन्न प्रकार किया जा सकता है:

public interface C<T, U> where T : B<U> where U : A { ... } 

प्रकार तर्क पर प्रतिबंध के पाठ्यक्रम पहले मामले में तंग कर रहे हैं।

1

सी जेनेरिक जेनेरिक प्रकार (बेहतर शब्द की कमी के लिए) जैसा दिखता है।

इसके बजाय सी काम की परिभाषा क्या होगी?

public interface C<T,U> where T : B<U> where U : A 
{ 
    List<T> b{ get; set; } 
} 
1

इंटरफ़ेस B में सामान्य प्रकार के बाद से ही प्रकार A का एक उदाहरण हो सकता है, इंटरफ़ेस C में टाइप करते B<A> की T घोषित करने के लिए की जरूरत है:

public interface A { } 
public interface B<T> where T : A 
{ 
    List<T> a { get; set; } 
} 
public interface C<T> where T : B<A> 
{ 
    List<T> b { get; set; } 
} 
1

इसका कारण यह है कि आप एक <List<T>> जहां T है B<T> इस समय आपके पास List<B> है जहां आपको B के लिए एक प्रकार निर्दिष्ट करने की आवश्यकता है। यह आपकी त्रुटि का कारण है।

public interface C<T, T2> where T : B<T2> 
    where T2 : A 
{ 
    List<T> b { get; set; } 
} 

कास्ट T2A के लिए और फिर आप :)

1

आप की तरह

public interface A { } 
public interface B<T> where T : A 
{ 
    List<T> a { get; set; } 
} 
public interface BA : B<A> 
{ 
} 
public interface C<T> where T : BA 
{ 
    List<T> b { get; set; } // << ERROR: Using the generic type 'B<T>' requires 1 type arguments 
} 

यहाँ एक और इंटरफ़ेस जोड़ने यह उद्देश्य का समाधान करता है सकते हैं ठीक हो जाएगा?