2010-06-15 9 views
15

ऐसा लगता है कि सी # टेम्पलेट्स की तरह सी ++ का समर्थन नहीं करता है। उदाहरण के लिएसी # में टेम्पलेट फ़ंक्शन - रिटर्न टाइप?

template <class myType> 
myType GetMax (myType a, myType b) { 
return (a>b?a:b); 
} 

मैं चाहता हूं कि मेरे फ़ंक्शन के पैरामीटर के आधार पर रिटर्न प्रकार हो, मैं इसे सी # में कैसे प्राप्त कर सकता हूं? सी #

संपादित करें: क्या मैं ऑब्जेक्ट का उपयोग कर सकता हूं और लगभग उसी उद्देश्य के लिए टाइप टाइप कर सकता हूं?

+0

जैसे कुछ बात मतलब मैं नहीं दिख रहा है कि कैसे आप एक ही बात को पूरा करने के, कोई GetType का उपयोग होता है। और आप एक एपीआई रिटर्निंग ऑब्जेक्ट नहीं चाहते हैं जब तक कि आप कॉलर को पूरे स्थान पर डालने के लिए खुश न हों। –

उत्तर

31

सी ++ सी # में टेम्पलेट्स के सबसे करीब जेनरिक है - लेकिन वे बहुत बंद नहीं कर रहे हैं। विशेष रूप से, आप सामान्य प्रकार के मानों के बीच > जैसे ऑपरेटरों का उपयोग नहीं कर सकते हैं, क्योंकि संकलक उनके बारे में नहीं जानते (और आप ऑपरेटरों के आधार पर प्रकारों को बाधित नहीं कर सकते हैं)। दूसरी ओर, आप लिख सकते हैं:

public T GetMax<T>(T lhs, T rhs) 
{ 
    return Comparer<T>.Default.Compare(lhs, rhs) > 0 ? lhs : rhs; 
} 

या

public T GetMax<T>(T lhs, T rhs) where T : IComparable<T> 
{ 
    return lhs.CompareTo(rhs) > 0 ? lhs : rhs; 
} 

ध्यान दें कि अशक्त-सुरक्षित है इनमें से पहला; दूसरा नहीं है।

जेनिक्स का एक पूर्ण विवरण स्टैक ओवरफ़्लो उत्तर के दायरे से काफी अच्छा है; MSDN में कुछ जानकारी है, या अपनी पसंदीदा सी # पुस्तक से परामर्श लें।

+1

मैंने सुना है कि गहराई में सी # जेनिक्स के कुछ अच्छे स्पष्टीकरण हैं :) – SWeko

+1

मैंने जो फ़ंक्शन दिया वह सिर्फ एक नमूना था, तुलना के अलावा अन्य कार्यों के बारे में क्या? – SMUsamaShah

+0

@ लाइफ 2 एचओ: अच्छा, आप क्या काम करना चाहते हैं? क्या यह एक उदाहरण विधि है जो एक इंटरफ़ेस में निर्दिष्ट है? यदि हां, तो आप ठीक हैं। –

0

जेनेरिक्स!

class MyClass<T> where T : IEnumerable (any parent class here!) 
{ 
    T myGeneric {get; set;} 
} 
1

आप generics पर एक नज़र डालना चाहते हैं। सिंटेक्स:

public T GetMax<T>(T a, T b) { 
    return (a>b?a:b); 
} 

अद्यतन क्योंकि कुछ टिप्पणियों के ... मैं सिर्फ एक बहुत जल्दी अवलोकन प्रदान करना चाहता था। हाँ मुझे लगता है कि यह ठीक से संकलित या निष्पादित नहीं करता है। लेकिन यह मूल विचार है कि यह कैसा दिखता है। इस विषय पर आपको अधिक पूर्ण उत्तर मिलेंगे - इस बीच।

निष्पादन सिंटेक्स:

int a = 5; 
int b = 10; 
int result = GetMax(a, b); 

आशा इस मदद करता है,

सादर, थॉमस

+0

मैं वही कहने वाला था लेकिन यह लाइन 'रिटर्न (ए> बी? ए: बी) के कारण संकलित नहीं होगा;' उसे एक इंटरफ़ेस बाधा या कुछ की आवश्यकता होगी ... –

+1

आप इस तरह से ए और बी की तुलना नहीं कर सकते हैं, क्योंकि संकलक को पता नहीं है कि टी क्या है। क्या होगा यदि टाइप टी तुलना का समर्थन नहीं करता है? –

2

आपका कोड कुछ इस तरह बन जाएगा:

public T GetMax<T>(T a, T b) where T : IComparable<T> 
{ 
    return a.CompareTo(b) > 0 ? a : b; 
} 
6

सी # में जेनेरिक्स C++ टेम्पलेट्स के रूप में के रूप में शक्तिशाली नहीं हैं। आप क्या करना चाहते हैं सी # में काम नहीं करता है।

एक हैक/अपनी स्थिति के लिए वैकल्पिक हल

public T GetMax<T>(T a, T b) where T: IComparable { 
    if(a.CompareTo(b) > 0) { 
     return a; 
    } 
    return b; 
} 
+0

मैंने जो फ़ंक्शन दिया वह सिर्फ नमूना था, तुलना के अलावा अन्य कार्यों के बारे में क्या? – SMUsamaShah

+1

@ लाइफएच 2 ओ: यह निर्भर करता है - क्या यह एक इंटरफ़ेस में निर्दिष्ट है? यदि ऐसा है, तो आप इंटरफेस को लागू करने के लिए जेनेरिक प्रकार को बाधित कर सकते हैं (या किसी दिए गए बेस क्लास से प्राप्त होते हैं)। –

+1

एक सी ++ डेवलपर के रूप में आप स्वयं को सी # जेनिक्स से निराश कर सकते हैं। लेकिन वे अभी भी कई परिदृश्यों में सीखने के लायक हैं, और सीखने लायक हैं। –

0

आप इस

public static IEnumerable<TResult> SelectIfNotNull<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) 
    { 
     if (source == null) return null; 
     return source.Select(selector); 
    } 

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

  • कोई संबंधित समस्या नहीं^_^