2010-10-23 13 views
10

मैं एक साधारण विधि बनाना चाहता हूं जो मान प्रकार और संदर्भ प्रकार पैरामीटर स्वीकार करता है, यानी int मान है, और स्ट्रिंग संदर्भ है।एक सी # जेनेरिक विधि बना रहा है जो (शून्य) मान प्रकार और संदर्भ प्रकार को स्वीकार करता है?

तो यह है कि मैं क्या के साथ शुरू:

var r1 = areBothNotNull<int>(3, 4); // will be true 
var r2 = areBothNotNull<int>(3, null); // will be false 
var r3 = areBothNotNull<string>("three", "four"); // will be true 
var r4 = areBothNotNull<string>(null, "four"); // will be false 

लेकिन पहले इस मुद्दे को मैं मुठभेड़

The type 'T' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'System.Nullable'
है:

public bool areBothNotNull<T>(T? p1, T? p2) 
{ 
    return (p1.HasValue && p2.HasValue); 
} 

तो मैं इस तरह इसका इस्तेमाल करने में सक्षम होना चाहते

आगे बढ़ने के लिए मैं अपनी विधि

पर एक संरचना बाधा जोड़ता हूं
public bool areBothNotNull<T>(T? p1, T? p2) where T : struct 

लेकिन अब विधि स्ट्रिंग आधारित कॉल को स्वीकार नहीं करेगा, और मुझे इस त्रुटि देता है:

The type 'string' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method.

यह संभव है? या हम ऐसा करने से क्यों रोके हैं?

+1

जो एक अजीब बात करना चाहता है? –

+5

यह अजीब बात नहीं है, यह सिर्फ सी ++ की मीठी गंध है। –

उत्तर

22

आपकी समस्या है कि आप जेनेरिक प्रकार की कमी है कि एक दूसरे के साथ परस्पर विरोधी हैं चाहते हैं: मूल्य प्रकार के साथ

  • Nullable<T> काम करता है केवल
  • संदर्भ प्रकार मूल्य प्रकार नहीं कर रहे हैं

तो आप करेंगे आपके कोड के काम के लिए दो ओवरलोड होने की आवश्यकता है:

public static bool areBothNotNull<T>(T? p1, T? p2) where T : struct 
{    
    return (p1.HasValue && p2.HasValue); 
} 

public static bool areBothNotNull<T>(T p1, T p2) 
{ 
    return (p1 != null && p2 != null); 
} 

फिर भी, निम्न पंक्ति संकलन कभी नहीं होगा: जहां सामान्य प्रकार तर्क कहा गया है कि मानकों प्रकार string के हैं, लेकिन कोड के बजाय int रों पारित करने के लिए कोशिश करता है

var r3 = areBothNotNull<string>(3, 4); 

वहाँ एक संघर्ष यहाँ, है।

+0

मैं यह भी जोड़ूंगा कि टी: संरचना और कहां टी: वर्ग विधियों के तरीकों से है। –

+1

क्षमा करें यह लाइन आर 3 के लिए एक प्रतिलिपि/पेस्ट गलती थी, मैं सवाल अपडेट करूंगा, "तीन", "चार" पैरामीटर होना चाहिए। –

+0

@ सारा: नालीबल को समझने के बारे में, मैंने कुछ समय पहले एक ब्लॉग पोस्ट लिखा था: http://softwareblog.alcedo.com/post/2010/02/16/Nullable3cT3e-vs-null.aspx –

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