2010-07-25 16 views
67

मैं निर्माण कर रहे एक धाराप्रवाह परीक्षण ढांचे में उपयोग किए जाने वाले संख्यात्मक प्रकारों पर एक विस्तार विधि लिखने की कोशिश कर रहा हूं। मूल रूप से, मैं ऐसा करना चाहते हैं:संख्यात्मक प्रकारों से मेल खाने के लिए सामान्य बाधा

public static ShouldBeGreaterThan<T>(this T actual, T expected, string message) 
    where T : int || T: double || etc... 

बस where T : struct, ऐसा नहीं करता है के बाद से वह भी किसी और मैं भूल रहा string और bool, और संभवतः कुछ भरपाई कर देंगे। क्या केवल कुछ संख्यात्मक प्रकार से मेल खाने के लिए मैं कुछ कर सकता हूं? (विशेष रूप से > और < ऑपरेटरों को लागू करने के प्रकार, इसलिए मैं उनकी तुलना कर सकता हूं ... यदि इसका मतलब है कि मैं तारीखों से मेल खाता हूं, तो यह वास्तव में कोई फर्क नहीं पड़ता - एक्सटेंशन अभी भी वही करेगा जो मैं उम्मीद करता हूं।)

+6

जॉन स्कीट और मार्क ग्रेवल ने इसके लिए कुछ रोचक कक्षाएं एकत्र की: http://www.yoda.arachsys.com/csharp/genericoperators.html –

+10

@ वास्तव में यह "मार्क" है, लेकिन मैं आपको छोड़ दूंगा - बहुत कम लोग इसे सही मानते हैं; पी –

उत्तर

48

इस मामले में आप अपनी जेनेरिक को बाधित करना चाहते हैं IComparable इंटरफ़ेस, जो आपको CompareTo विधि तक पहुंच प्रदान करता है, क्योंकि यह इंटरफ़ेस आपको ShouldBeGreaterThan पर प्रश्न का उत्तर देने की अनुमति देता है।

संख्यात्मक प्रकार उस इंटरफ़ेस को लागू करेंगे और तथ्य यह है कि यह तारों पर भी काम करता है, आपको इतना परेशान नहीं करना चाहिए।

+1

यह कम से कम इस समस्या के लिए संख्यात्मक प्रकारों के लिए एक सामान्य ऑपरेटर इंटरफ़ेस से बेहतर समाधान है। –

+0

क्या कोई तरीका है कि मैं '1.=' और '>' आदि के उपयोग की अनुमति देता हूं, 'इक्वल्स() 'और' .CompareTo'? –

5

स्टैक ओवरफ्लो इस तरह के प्रश्न से भरे हुए हैं। Take a look at this search। सी # संख्याओं से बाधित एक सामान्य प्रकार को परिभाषित करने के लिए एक तरीका का समर्थन नहीं करता है। अफसोस की बात है कि, आपकी सबसे अच्छी शर्त सभी ऑब्जेक्ट्स पर एक्सटेंशन विधि को कार्यान्वित करना है और इट्स, डबल्स, फ्लोट इत्यादि के लिए विधियों का एक सेट बनाने के लिए स्विच करें या

15
public static bool IsGreaterThan<T>(this T actual, T comp) where T : IComparable<T> 
{ 
    return actual.CompareTo(comp) > 0; 
} 

यदि आप चाहें तो आप स्ट्रक्चर बाधा जोड़ सकते हैं।

6

फ़िल्टर के रूप में उपयोग करने के लिए INumeric जैसे कुछ भी सामान्य नहीं है, इसलिए केवल संख्याओं को सीमित करना मुश्किल है। असल में, मुझे संदेह है कि यहां सबसे आसान तरीका बाधा पर जोर देता है, और विधि के अंदर Comparer<T>.Default.Compare का उपयोग करें।

यह इनबिल्ट प्रकार का समर्थन करता है दोनों सामान्य IComparable<T> और गैर सामान्य IComparable, और रेफरी-प्रकार, मूल्य प्रकार और Nullable<T> के माध्यम से उठाया उपयोग का समर्थन करता है।

पूर्ण ऑपरेटर उपयोग के लिए, MiscUtil's Operator class और GreaterThan आदि, जो उपयोगी हो सकता है आप वास्तव में (बल्कि इंटरफ़ेस से) ऑपरेटर का उपयोग करना चाहते हैं तो देखो। यह भी तरह Add आदि

+0

मार्क ग्रेवेल ने कहा, "यह सिर्फ कठिन है ** केवल संख्याओं तक सीमित है" लेकिन यह ** संभव ** ** रन टाइम और संकलन समय दोनों में है। कृपया मेरा जवाब देखें "क्या कोई ऐसी बाधा है जो मेरी जेनेरिक विधि को संख्यात्मक प्रकारों पर प्रतिबंधित करती है?" प्रश्न.https: //stackoverflow.com/questions/32664/is-there-a-constraint-that-restults-my-generic-method-to-numeric-types –

+1

@Erez जो काम करेगा, लेकिन मौत है प्रदर्शन महत्वपूर्ण कोड - मुक्केबाजी और प्रकार की जांच के बहुत सारे। सी # 7.2-सी # 8.0 अवधि में कहीं भी हमें जेनेरिकों को यह अधिक कुशलता से करने के लिए अतिरिक्त देखने की संभावना है। –

+0

मैं तब तक इंतजार नहीं कर सकता जब तक यह माइक्रोसॉफ्ट द्वारा समर्थित नहीं होगा। –

38
where T : struct, 
      IComparable, 
      IComparable<T>, 
      IConvertible, 
      IEquatable<T>, 
      IFormattable 

कि निकटतम मैं एक अंकीय बाधा को प्राप्त कर सकते हैं अन्य ऑपरेटरों के लिए उपयोग प्रदान करता है। सभी संख्यात्मक प्रकार इन 5 इंटरफेस को लागू करते हैं, लेकिन IFormattable बूल द्वारा कार्यान्वित नहीं किया जाता है, और तार एक संदर्भ प्रकार हैं, इसलिए वे लागू नहीं हैं।

कुछ अन्य चीजें हैं जो इन्हें कार्यान्वित करती हैं - उदाहरण के लिए डेटटाइम, इसलिए यह वास्तव में आवश्यक नहीं है, लेकिन बहुत से तात्कालिकता को रोकता है जो आप नहीं चाहते हैं।

+0

इसके साथ ही, मैं सामान्य गणित परिचालनों का उपयोग नहीं कर सकता। 'ऑपरेटर '==' प्रकार 'टी' और 'फ्लोट' प्रकार के संचालन पर लागू नहीं किया जा सकता है –

1

यह कामकाज मदद कर सकता है: Workaround using policies। यह संकलन समय सुरक्षा प्रदान करता है।