2010-02-09 14 views
76

मैं सी # के लिए नया हूं और समझ में नहीं आता कि निम्न कोड क्यों काम नहीं करता है।सी # जेनेरिक त्रुटि के साथ सहायता - "प्रकार 'टी' एक गैर-शून्य मूल्य मान होना चाहिए"

प्रकार 'टी' आदेश सामान्य प्रकार या विधि 'सिस्टम में पैरामीटर के रूप में इसका इस्तेमाल करने के' टी 'में गैर-व्यर्थ मान प्रकार होना चाहिए:

public static Nullable<T> CoalesceMax<T>(Nullable<T> a, Nullable<T> b) where T : IComparable 
{ 
    if (a.HasValue && b.HasValue) 
     return a.Value.CompareTo(b.Value) < 0 ? b : a; 
    else if (a.HasValue) 
     return a; 
    else 
     return b; 
} 

// Sample usage: 
public DateTime? CalculateDate(DataRow row) 
{ 
    DateTime? result = null; 
    if (!(row["EXPIRATION_DATE"] is DBNull)) 
     result = DateTime.Parse((string)row["EXPIRATION_DATE"]); 
    if (!(row["SHIPPING_DATE"] is DBNull)) 
     result = CoalesceMax(
      result 
      DateTime.Parse((string)row["SHIPPING_DATE"]).AddYears(1)); 
    // etc. 
    return result; 
} 

यह संकलन के दौरान निम्नलिखित त्रुटि देता है struct बाधा:

public static Nullable<T> CoalesceMax<T> 
    (Nullable<T> a, Nullable<T> b) where T : struct, IComparable 

अन्यथा सी # क्याबाहर काम करने की कोशिश करेंगे .Nullable < टी > '

+1

संकलक त्रुटि, क्योंकि उसी त्रुटि है आप समारोह परिभाषा की लाइन देता था। – SLaks

उत्तर

144

आप एक टी जोड़ने की जरूरतका अर्थ है, और यह एहसास है कि इसमें पहले से ही Nullable<T> द्वारा आवश्यक बाधा नहीं है। दूसरे शब्दों में, आप कॉल करने के लिए कोशिश कर सकते:

CoalesceMax<string>(...) 

जो कोई मतलब नहीं होगा, के रूप में Nullable<string> मान्य नहीं है।

4

आपकी जेनेरिक विधि Nullable<T> का उपयोग कर रही है।

हालांकि, आप T के प्रकार को बाधित नहीं कर रहे हैं, इसलिए यह Nullable<Form> हो सकता है, जो स्पष्ट रूप से अमान्य है।

आप where T : struct, IComparable को बाधा को बदलने के लिए यह सुनिश्चित करें कि T केवल एक मान प्रकार किया जा सकता है की जरूरत है।

11

Nullable<T> प्रकार पर उस पर एक बाधा है जिसके लिए T एक मान प्रकार (struct सी #) होने की आवश्यकता है। यही कारण है कि संकलक आपको Nullable<T> के बारे में बता रहा है, न कि आपके फ़ंक्शन या उस फ़ंक्शन की कॉल साइट - यह Nullable कक्षा है जो त्रुटि का मूल कारण है, इसलिए यह वास्तव में अधिक सहायक है कि यदि कंपाइलर ने आपके फ़ंक्शन को इंगित किया है और कहा "यह सही नहीं है, इसे ठीक करो!" (कल्पना करें कि CoalesceMax ने कई जेनेरिकों का उपयोग किया है, और उनमें से केवल एक पर बाधा का उल्लंघन किया है - यह जानने के लिए और अधिक उपयोगी है कि कौन सी जेनेरिक की बाधा टूट गई थी, यह जानने के लिए कि CoalesceMax में एक या अधिक बाधाएं टूट गई थीं)।

समाधान आपके T और उनके T को समान बाधा उत्पन्न करके संगत बनाना है।

public static Nullable<T> CoalesceMax<T>(Nullable<T> a, Nullable<T> b) where T : struct, IComparable{ 
    ... 
} 
1

नहीं वास्तव में ओ पी का जवाब लेकिन जब से यह पहली बात यह है कि एक ही त्रुटि संदेश के लिए गूगल पर पॉपअप था: यह struct बाधा है, जो सभी इंटरफेस/नई बाधाओं से पहले आना चाहिए जोड़कर किया जाता है , मैं अपने विधि की तुलना में मेरी कक्षा परिभाषा पर बाधा जोड़ने के लिए, जैसे

public class MyClass<T> where T : struct 
{ 
    public void MyMethod(T? value) 
    { 
    } 
} 
संबंधित मुद्दे