2010-12-18 10 views
10

मुझे स्पष्ट रूप से सामान्य पैरामीटर प्रकार क्यों प्रदान करना चाहिए जबकि संकलक को प्रकार का अनुमान लगाना चाहिए?मुझे स्पष्ट रूप से सामान्य पैरामीटर प्रकार क्यों प्रदान करना चाहिए जबकि संकलक को प्रकार का अनुमान लगाना चाहिए?

public static T2 Cast<T1,T2>(this T1 arg) where T2 : class where T1 : class 
{ 
    return arg as T2; 
} 

नमूना उपयोग:

objOfTypeT2 = objOfTypeT1.Cast<TypeT1,TypeT2>(); 


एक अधिक बुद्धिमान संकलक के साथ अपने वांछित उपयोग की तुलना में:

objOfTypeT2 = objOfTypeT1.Cast<TypeT2>(); 

या शायद मैं होना चाहिए अधिक बुद्धिमान :-)

सावधान रहें कि मैं साबित करता हूं वापसी प्रकार पर विचार करें। मैं उस वस्तु को प्रदान नहीं करना चाहता जिसे मैंने उस पर फ़ंक्शन कहा था, विधि एक्सटेंशन विधि है।

+0

क्या सामान्य तरीके से (रों) कास्टिंग के साथ गलत क्या है? –

+1

क्यों न सिर्फ सार्वजनिक स्थिर टी कास्ट (यह ऑब्जेक्ट वैल्यू) {वापसी मूल्य टी के रूप में;} क्यों नहीं? – Rauhotz

+0

@Rauhotz मैंने जो कुछ बताया है, बस जिज्ञासा और एक और अधिभार की तलाश में मुझे इसे मूल्य प्रकारों के साथ उपयोग करने में सक्षम बनाता है, क्योंकि मैं सामान्य बाधाओं के साथ अधिभार नहीं बना सकता। –

उत्तर

11

विनिर्देश सीमा सभी प्रकार या कुछ भी सामान्य तरीकों के लिए पैरामीटर अनुमान टाइप करता है। आप आंशिक अनुमान नहीं हो सकता है।

तर्क शायद प्रकार अनुमान नियमों को सरल बना रहा है (जो पहले से ही बहुत ही जटिल हैं, क्योंकि उन्हें खाता ओवरलोडिंग नियम भी लेना है)।

+0

मैंने अनुमान लगाया है, इसलिए मैं पैरामीटर को पुन: व्यवस्थित करता हूं ताकि अनुमानित प्रकार अंतिम पैरामीटर होगा लेकिन कोई मौका नहीं होगा। –

+0

@ जेनी: आदेश वास्तव में यहां कोई फर्क नहीं पड़ता। या तो कंपाइलर आपके लिए सभी प्रकार के तर्कों का अनुमान लगा सकता है, इस मामले में आप उन्हें सभी को छोड़ सकते हैं, या यह कम से कम एक अनुमान नहीं लगा सकता है। बाद के मामले में, आपको हमेशा उनमें से * सभी * निर्दिष्ट करना होगा। –

15

अनुमान वापसी प्रकार पर विचार नहीं करता है; हालांकि, आप जेनेरिकों को विभाजित करने का प्रयास कर सकते हैं; उदाहरण के लिए, आप कोड अनुमति देने के लिए लिख सकते हैं:

.Cast().To<Type2>() 

होने से (अपरीक्षित; संकेत केवल)

public static CastHelper<T> Cast<T>(this T obj) { 
    return new CastHelper<T>(obj); 
} 
public struct CastHelper<TFrom> { 
    private readonly TFrom obj; 
    public CastHelper(TFrom obj) { this.obj = obj;} 
    public TTo To<TTo>() { 
     // your code here 
    } 
} 
+0

सावधान रहें कि मैं रिटर्न प्रकार प्रदान करता हूं। मैं उस वस्तु को प्रदान नहीं करना चाहता जिसे मैंने उस पर फ़ंक्शन कहा था, विधि एक विस्तार विधि है। –

+0

@ जनी और उदाहरण देखें - मुझे प्रकार से शामिल नहीं है; बस गंतव्य प्रकार। –

+0

हाँ, मैं कहूंगा कि इस समय एकमात्र कामकाज है। –

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