2009-06-23 6 views
9

मैं इस तरह एक विधि लिखने के लिए कोशिश कर रहा हूँ:मुझे टाइपोफ (टी) पता है लेकिन संकलक नहीं करता है। कैसे ठीक करना है?

public static T Test<T>() 
{ 
    if (typeof(T)==typeof(string)) 
    return "1241"; 

    // do something else 
} 

लेकिन मैं यह पता लगाने की कैसे इसे हटा नहीं कर पा रहे। मैं उस प्रकार के टी के आधार पर मान वापस करना चाहता हूं जिस पर विधि लागू की गई थी। मुझे स्ट्रिंग्स, इंट्स, कस्टम क्लासेस, लिस्ट इत्यादि लौटने की ज़रूरत है।

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

स्पष्टीकरण: उपरोक्त उदाहरण निम्न त्रुटि देता है: टाइप करने के लिए टी

आदर्श समाधान मूल्य प्रकार और संदर्भ प्रकार पर काम करेगा स्ट्रिंग कनवर्ट नहीं कर सकता, और अधिभार समाधान के लिए एक डमी पैरामीटर शामिल नहीं होगा।

मुझे संदेह है कि यह आदर्श समाधान मौजूद है या नहीं।

धन्यवाद, लुकास

+0

typeof (टी) काम करना चाहिए यह परीक्षण नहीं किया गया है। संकलक समस्या कौन सा त्रुटि संदेश करता है? –

उत्तर

13

object को मध्यवर्ती डाली आदर्श नहीं है, लेकिन कुछ इस तरह चाल करना चाहिए:

public static T Test<T>() 
{ 
    if (typeof(T) == typeof(string)) 
    return (T)(object)"1241"; // this works. 

    // do something else 
} 

सभी प्रश्नों के उत्तर के लिए धन्यवाद:

public static T Test<T>() 
{ 
    if (typeof(T) == typeof(string)) 
     return (T)(object)"1241"; 

    // do something else 
} 
+0

काम नहीं करता है आह बकवास, मैंने अभी भी यह कहा है! :) – leppie

6

आप टी, जैसे करने के लिए दिया गया मान कास्ट करने के लिए है संदर्भ प्रकार के लिए कुछ इस तरह:

public static T Test<T>() where T : class 
{ 
    if (typeof(T)==typeof(string)) 
    return "1241" as T; 

    return default(T); 
} 
+0

कंपाइलर कहता है: टाइप 'स्ट्रिंग' को टी –

+0

में परिवर्तित नहीं कर सकता क्षमा करें, मैंने नमूना अपडेट किया है। "जहां टी: कक्षा" भाग ध्यान दें। – M4N

+0

केवल समस्या यह है कि टी एक वर्ग होना चाहिए, इसलिए int, long, आदि के लिए काम नहीं करेगा –

5

खबरदार! नीचे दिया गया समाधान कार्य (मोनो gmcs सी # कंपाइलर का उपयोग करके सत्यापित किया गया है)।

हालांकि, सी # मानक के पढ़ने के द्वारा काम करना चाहिए, क्योंकि ओवरलोड रिज़ॉल्यूशन संभव होने पर विधि के गैर-सामान्य संस्करण का पक्ष लेना चाहिए। ईसीएमए -334 में प्रासंगिक अनुभाग 25.1.7 है: "सामान्य वर्गों में अधिभार"। इसके अलावा, एरिक लिपर्ट भी blog posting में ऐसा भी कहता है।

प्रतिक्रिया की सराहना की जाएगी: यह अपेक्षा के अनुसार क्यों काम नहीं करता है?


आप असंबंधित प्रकार और असंबंधित व्यवहार मिल गया है: इस कोड चिल्लाती है "! उपयोग अधिक भार"

जेनेरिक्स असंबंधित प्रकार के लिए उपयुक्त होगा, फिर भी समान (या काफी हद तक समान) व्यवहार।

इस (पूरा परीक्षण कार्यक्रम व्यवहार पुन: पेश करने) कार्य करें:

using System; 

class TestClass { 
    public static T Test<T>() { 
     return TestWith(default(T)); 
     // do something else 
    } 

    public static string TestWith(string dummy) { 
     // Used only for `string`. 
     return "string"; 
    } 

    public static T TestWith<T>(T dummy) { 
     // Used for everything else. 
     return dummy; 
    } 

    static void Main() { 
     Console.WriteLine("Expected \"0\", got \"{0}\"", Test<int>()); 
     Console.WriteLine("Expected \"string\", got \"{0}\"", Test<string>()); 
    } 
} 

gmcs साथ संकलित, इस पैदावार:

Expected "0", got "0" 
Expected "string", got "" 

यहाँ, पैरामीटर केवल अतिभारित कॉल के बहुविकल्पी के लिए कार्य करता है। स्पष्ट जेनेरिक पैरामीटर का उपयोग यहां नहीं किया जा सकता है क्योंकि कार्यों में से एक (string विशेषज्ञता) सामान्य नहीं है।

+0

टेस्ट अभी भी टेस्टविथ (स्ट्रिंग) –

+0

पैट्रिक के बजाय टेस्टविथ पर कॉल करता है: पैट्रिक: अरे। सच। मुझे यकीन था कि मैंने पहले ही इसका इस्तेमाल किया था। ड्रॉइंग बोर्ड पर वापस। –

+0

क्षमा करें, मुझे समझ में नहीं आता कि समस्या क्या है। क्या आप एक प्रोग्राम प्रदान कर सकते हैं जो वास्तव में संकलित करता है और आउटपुट दिखाता है जिसे आप उम्मीद नहीं करते हैं? –

2

public static T Test<T>() where T : class 
{ 
    if (typeof(T) == typeof(string)) return "asdf" as T; // do something else 
    // do something else   
} 
+1

"टी के रूप में" उपयोग करने के बजाय हार्ड कस्ट "(टी)" करें। फिर आप कहां से खंड हटा सकते हैं। – Jehof

+0

@ जेहोफ: लेकिन कोड अब संकलित नहीं होगा। तो नहीं, ऐसा मत करो। –

+0

@ कोनराड। बेशक आप ठीक हैं। यह – Jehof

1

आप ChangeType उपयोग कर सकते हैं का प्रयास करें?

public static T Test<T>() 
{ 
    if (typeof(T)==typeof(string)) 
     return (T)Convert.ChangeType("1234", typeof(T), CultureInfo.InvariantCulture); 
    return default(T); 
} 
0

मैं समाधान नहीं मिला ।

+0

कृपया ल्यूक के जवाब की जांच करें, वह आपके जैसा ही समाधान के साथ आया –

0
public static T Test<T>() 
{ 
    if (typeof(T)==typeof(string)) 
    return (T)Convert.ChangeType("1241", typeof(T)); 

    return default(T); 
} 

मैं हालांकि :-)

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

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