2010-07-12 12 views
6

में नेस्टेड सामान्य कक्षाएं करने के लिए (यदि उपयुक्त नाम है) मैं निम्नलिखित प्रकारकैसे कोई तिथि नहीं

public class EnumerableDisposer<IEnumerable<IDisposable>> 

के एक वर्ग बनाना चाहते हैं, लेकिन यह मुझे इसे इस तरह की घोषणा नहीं दूँगा। मैंने यह भी कोशिश की है:

public class EnumerableDisposer<T> : IDisposable where T : IEnumerable<J> where J : IDisposable 

लेकिन संकलक मुझे बताता है कि प्रकार/नामस्थान जे नहीं मिला।

मुझे इस कक्षा को बनाने के लिए क्या करना है?

public class EnumerableDisposer<T, J> : IDisposable 
    where T : IEnumerable<J> where J : IDisposable 
{ 
    // Implement... 

दुर्भाग्य से, किसी भी आंतरिक प्रकार (IEnumerable<J>, अपने कोड में) रैप करने के लिए में, अपने "रैपिंग" वर्ग प्रकार J सामान्य परिभाषा में परिभाषित करने की आवश्यकता है:

उत्तर

12

आप क्या करने की जरूरत। इसके अलावा, IEnumerable<J> बाधा जोड़ने के लिए, आपको अन्य प्रकार T होना चाहिए।

कहा जा रहा है, अगर आप डबल सामान्य प्रकार विनिर्देश से बचना चाहते हैं, तो आप हमेशा यह फिर से काम कर सकता है इस प्रकार है:

public class EnumerableDisposer<T> : IDisposable 
    where T : IDisposable 
{ 
    public EnumerableDisposer(IEnumerable<T> enumerable) 
    { 
     // ... 

यह मजबूर करता है कि आप एक IEnumerable<T> जहां टी IDisposable है के साथ निर्माण करने के लिए एक साथ, एकल जेनेरिक प्रकार। चूंकि आप कन्स्ट्रक्टर के माध्यम से प्रभावी ढंग से IEnumerable<T> बाधा जोड़ रहे हैं, यह कार्य के साथ-साथ पिछले विकल्प भी काम करेगा। केवल नकारात्मक बात यह है कि आपको निर्माण समय पर जेनेरिक किया जाना चाहिए, लेकिन नाम दिया गया है, मुझे संदेह है कि यह ठीक रहेगा ...

+0

ये चाल करने लगते हैं। सबको शुक्रीया। – scott

5

आपको J को निश्चित करने की आवश्यकता है।

जैसे

public class EnumerableDispose<T, J> : IDisposable 
    where T : IEnumerable<T> 
    where J : IDisposable 

बेहतर होगा:

public class EnumerableDisposer<T, J> : IDisposable 
    where T : IEnumerable<J> 
    where J : IDisposable 

ध्यान दें कि इन T और J मानकों हैं:

public class EnumerableDispose<T> : IEnumerable<T>, IDisposable 
    where T : IDisposable 
{ 
    public EnumerableDispose(IEnumerable<T> source) 
    { 
     // TODO: implement 
    } 
} 
0

आप एक अतिरिक्त J प्रकार पैरामीटर जोड़ कर ऐसा कर सकते हैं बाहरी वर्ग में भी किसी भी पैरामीटर से स्वतंत्र अगर उनके पास समान नाम हैं।

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