2010-11-05 10 views
13

मैं बाधाओं का उपयोग करके संभव प्रकार एन को ले जा सकता हूं। मैं एन को एक int या दशमलव होने के लिए प्रतिबंधित करना चाहता हूं।एक बाधा का उपयोग कर टी से मूल्य प्रकार को कैसे प्रतिबंधित करें?

public static Chart PopulateInto<T, N>(List<T> yAxis, List<N> xAxis) where N : int, decimal 
{ 
    // Do stuff here 
} 

सराहना की कोई मदद ...

+1

यदि वे केवल दो प्रकार हैं जिनकी आपको परवाह है तो मुझे लगता है कि आप विधि को अधिभारित कर सकते हैं। निश्चित रूप से यह 4 अधिभार है लेकिन यह बहुत बुरा नहीं है। –

उत्तर

7

क्यों नहीं सिर्फ इस कार्य करें:

public static Chart PopulateInto<T>(List<T> yAxis, List<int> xAxis) 
{ 
    // Do stuff here 
} 

public static Chart PopulateInto<T>(List<T> yAxis, List<decimal> xAxis) 
{ 
    // Do stuff here 
} 
+1

मैंने मूल रूप से ऐसा किया था, लेकिन मुझे कुछ केवलर –

+10

आईएमओ की उम्मीद है, 'केवल' से बचें और पठनीय/सही के साथ चिपके रहें। – Marc

+0

और मेरे जेनेरिक बंद हैं, यही मुझे शुक्रवार की रात को उत्तर लिखने के लिए मिलता है, मुझे इसे सही करने दें। –

13

यह एक विशिष्ट मूल्य प्रकार के एक सामान्य पैरामीटर विवश करने के लिए संभव नहीं है।

आप लेकिन यह where N : struct जोड़कर एक मान प्रकार या struct होने के लिए मजबूर कर सकते हैं, लेकिन इतना ही है।

+1

इसे संभालने का एक वैकल्पिक तरीका 'int' या 'दशमलव' सूचियों के लिए विशिष्ट ओवरलोड होना है। –

6

वहाँ एक बाधा के साथ ऐसा करने का कोई तरीका नहीं है। हालांकि, एक और दृष्टिकोण यह मानते हुए कि PopulateInto एक सामान्य एन के साथ काम कर सकता है, कोर एल्गोरिह्म जेनेरिक और प्राइवेट बनाने के लिए और 2 सार्वजनिक अधिभार प्रदान करता है जो int और decimal क्रमशः लेते हैं। यह एक समान प्रभाव

public static Chart PopulateInto<T>(
    List<T> yAxis, 
    List<decimal> xAxis) { 

    return PopulateIntoCore(yAxis, xAxis); 
} 

public static Chart PopulateInto<T>(
    List<T> yAxis, 
    List<int> xAxis) { 

    return PopulateIntoCore(yAxis, xAxis); 
} 

private static Chart PopulateIntoCore<T, N>(
    List<T> yAxis, 
    List<N> xAxis) where N : struct { 
    ... 
} 
+0

पहले दो सार्वजनिक होना चाहिए, सही? ;-) –

+1

@ मार्क, हाँ, यह मेरे उत्तर का क्रूक्स होगा;) फिक्स्ड – JaredPar

2

जैसा कि पीटर ने कहा था, आप इस पर संकलन-समय की जांच का उपयोग नहीं कर सकते हैं। हालांकि, आप रनटाइम पर निम्न कार्य कर सकते हैं:

if(!(typeof(N).equals(typeof(int32))) && !(typeof(N).equals(typeof(decimal)))) 
    // do something 
+1

हाँ, क्यों नहीं। एक अवैधऑपरेशन अपवाद फेंको। –

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