2013-05-24 4 views
10

मुझे निम्न त्रुटि में यह त्रुटि क्यों मिल रही है?प्रकार 'टी' सामान्य प्रकार या विधि 'पैरामीटर' पैरामीटर 'टी' के रूप में इसका उपयोग करने के लिए 'टी' होना चाहिए, जो कि सामान्य प्रकार या विधि 'सिस्टम में नहीं है। Nullable <T>'

void Main() 
{ 
    int? a = 1; 
    int? b = AddOne(1); 
    a.Dump(); 
} 

static Nullable<int> AddOne(Nullable<int> nullable) 
{ 
    return ApplyFunction<int, int>(nullable, (int x) => x + 1); 
} 

static Nullable<T> ApplyFunction<T, TResult>(Nullable<T> nullable, Func<T, TResult> function) 
{ 
    if (nullable.HasValue) 
    { 
     T unwrapped = nullable.Value; 
     TResult result = function(unwrapped); 
     return new Nullable<TResult>(result); 
    } 
    else 
    { 
     return new Nullable<T>(); 
    } 
} 
+2

और सवाल क्या है ?? –

+0

अभी इसका परीक्षण नहीं कर सकता है, लेकिन आप 'कार्यान्वयन ' के बजाय 'आवेदन फ़ंक्शन ' पर कॉल करें? –

+2

डाउनवॉट्स क्यों? मुझे एक अच्छा सवाल लगता है। –

उत्तर

10

कोड के साथ कई समस्याएं जोड़ने की आवश्यकता है। पहला यह है कि आपके प्रकार निरर्थक होना चाहिए। आप इसे where T: struct निर्दिष्ट करके व्यक्त कर सकते हैं। आपको where TResult: struct निर्दिष्ट करने की भी आवश्यकता होगी क्योंकि आप इसे एक शून्य प्रकार के रूप में भी उपयोग कर रहे हैं।

एक बार जब आप where T: struct where TResult: struct को ठीक कर लेंगे तो आपको वापसी मूल्य प्रकार (जो गलत था) और कई अन्य चीजों को भी बदलने की आवश्यकता है।

उन सभी त्रुटियों को ठीक करने और सरल बनाने के बाद, आप इस के साथ हवा:

static TResult? ApplyFunction<T, TResult>(T? nullable, Func<T, TResult> function) 
       where T: struct 
       where TResult: struct 
{ 
    if (nullable.HasValue) 
     return function(nullable.Value); 
    else 
     return null; 
} 

नोट आप को फिर से लिखने सकते हैं कि Nullable<T>T? के रूप में जो बातें अधिक पठनीय बनाता है।

इसके अलावा, आप लिख सकता है कि एक बयान ?: का उपयोग कर, लेकिन मैं यह नहीं सोचता के रूप में के रूप में पठनीय है:

return nullable.HasValue ? (TResult?) function(nullable.Value) : null; 

आप एक विस्तार विधि में इस डाल करने के लिए चाहते हो सकता है:

public static class NullableExt 
{ 
    public static TResult? ApplyFunction<T, TResult>(this T? nullable, Func<T, TResult> function) 
     where T: struct 
     where TResult: struct 
    { 
     if (nullable.HasValue) 
      return function(nullable.Value); 
     else 
      return null; 
    } 
} 

फिर आप इस तरह कोड लिख सकते हैं:

int? x = 10; 
double? x1 = x.ApplyFunction(i => Math.Sqrt(i)); 
Console.WriteLine(x1); 

int? y = null; 
double? y1 = y.ApplyFunction(i => Math.Sqrt(i)); 
Console.WriteLine(y1); 
+2

'नया ट्रेशल्ट'() 'लिखने के बजाय, क्या यह सिर्फ' शून्य 'लिखना अधिक स्पष्ट नहीं है? यह अनुमान है कि 'Nullable <>' का दर्शन है। –

+0

@JeppeStigNielsen यह निश्चित है। मैं अपडेट करूंगा। :) –

+0

इसके बजाय: वापस शून्य करने के लिए। HasValue? (TResult?) फ़ंक्शन (nullable.Value): शून्य; आप वापसी वापस कर सकते हैं ?? शून्य; जो थोड़ा अच्छा है और अधिक पठनीय –

6

जैसा कि त्रुटि से पता चलता है, संकलक के पास कोई गारंटी नहीं है कि टी पहले से ही शून्य नहीं होगा। आपको टी:

static Nullable<T> ApplyFunction<T, TResult>(Nullable<T> nullable, 
    Func<T, TResult> function) : where T : struct 
           where TResult : struct 
+0

इसे काम करने के लिए आपको उससे अधिक परिवर्तनों की आवश्यकता होगी। उदाहरण के लिए, ट्रेशल्ट को भी एक संरचना होना चाहिए। –

+0

सच है, 'ट्रेशल्ट?' तय किया गया है :) –

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