2012-11-22 22 views
5

मुझे विश्वास नहीं है कि मैं इसे Google नहीं कर सकता। मुझे नहीं पता कि गूगल क्या है।सी #: जांचें कि टी टी बूल है

public static T GetValue<T>(T defaultValue) 
{ 
    if (T is bool) // <-- what is the correct syntax here? 
    return (T)true; // <-- I don't think this works either 
} 

संपादित करें: क्षमा करें मैंने उल्लेख नहीं किया है, ऊपर दिया गया कार्य केवल मेरा प्रश्न दिखाने के लिए है। यह एक असली काम नहीं है। उत्तर के लिए सभी को धन्यवाद!

+0

कंपाइलर त्रुटियों की खोज करने का प्रयास करें। मुझे यकीन है कि कई डुप्लीकेट हैं। कम से कम, * लागू होने पर प्रश्नों में * [कंपाइलर] त्रुटियों को शामिल करें। –

उत्तर

10

एक चाहिए उपयोग इस एक ही विधि/हस्ताक्षर और T के प्रकार उपयोग करना आवश्यक है (और वहाँ , इस तरह के लिए कारण रहे हैं, हालांकि, अगर वहाँ तो Albin का जवाब देखने के नहीं हैं):

public static T GetValue<T>(T defaultValue) 
{ 
    // Need to use typeof to get a Type object for bool, just as with T 
    if (typeof(T) == typeof(bool)) { 
    // Need to say "get out of my way C#" 
    // The first cast to object is required as true (bool) is 
    // otherwise not castable to an unrestricted T. 
    // This widen-restrict approach could result in a cast error, 
    // but from the above check it is known that T is bool. 
    return (T)(object)true; 
    } 
    // .. other stuff that .. does stuff. 
} 

हालांकि, true (जो बूलियन के लिए डिफ़ॉल्ट मान नहीं है) को स्पष्ट रूप से लौटा रहा है और defaultValue को अनदेखा कर रहा है अन्यथा .. संदेह है। लेकिन - It compiles! Ship it!

नोट्स:

  • उपयोग == प्रकार के लिए मज़बूती से उपवर्गों लिए काम नहीं करेगा (लेकिन यह ठीक है क्योंकि bool एक संरचना इतनी उपप्रकार भी कोई समस्या नहीं है)। उन मामलों में, IsAssignableFrom देखें।
  • typeof(T) आवश्यक रूप से पारित मूल्य का प्रकार नहीं है (जो संदर्भ प्रकारों के लिए null हो सकता है)। यह उपप्रकारों के साथ, मूल्य पर is का उपयोग करने वाले दृष्टिकोणों के लिए सूक्ष्म भिन्नताओं का कारण बन सकता है।
+0

+1। मैंने एक बार इस तरह के एक मुद्दे पर बिताए। – Guillaume

7

प्रकार की जांच न करें, जाँच चर

public static T GetValue<T>(T defaultValue) 
{ 
    if (defaultValue is bool) // <-- what is the correct syntax here? 
    return (T)true; 
} 

लेकिन सिर्फ एक पक्ष के रूप में नहीं, आप आमतौर पर कुछ गलत कर रहे हैं जब आप प्रकार की जाँच करते हैं और एक सामान्य प्रकार में विभिन्न प्रकार के लिए अलग से निपटने के लिए है ।

आप विशेष हैंडलिंग वाले प्रकारों के लिए अधिभार क्यों नहीं बनाते?

public static bool GetValue(bool defaultValue) 
{ 
    return true; 
} 
+0

आह, धन्यवाद, लेकिन मुझे यह फ़ंक्शन मिल गया है जो पहले से ही सभी स्ट्रिंग/int/double/float/दशमलव के लिए काम कर रहा है, बूल – Aximili

+2

'(टी) सत्य 'काम नहीं करता है, निश्चित रूप से – horgh

3

शायद आप default(T) देख रहे हैं, जो प्रदान किए गए प्रकार के लिए डिफ़ॉल्ट मान देता है। bool के लिए डिफ़ॉल्ट मान false है।

+1

+1: अच्छी धारणा! उपप्रकारों के लिए इस समाधान के मुद्दे को इंगित करने के लिए – horgh

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