2016-10-16 12 views
6

मैं विजुअल स्टूडियो 2015 का उपयोग कर रहा हूं और मेरे पास दो कथन हैं।जेनेरिक प्रकार - नाम सरलीकृत किया जा सकता है

Task<List<int>> taskWithInLineAction = new Task<List<int>>(() => 
{ 
    List<int> ints = new List<int>(); 
    for (int i = 0; i < 1000; i++) 
    { 
     ints.Add(i); 
    } 
    return ints; 
}); 

Task<List<int>> taskWithFactoryAndState = Task.Factory.StartNew<List<int>>((stateObj) => 
{ 
    List<int> ints = new List<int>(); 
    for (int i = 0; i < (int)stateObj; i++) 
    { 
     ints.Add(i); 
    } 
    return ints; 
}, 2000); 

Vs2015 मुझे चेतावनी दी है कि

Task.Factory.StartNew<List<int>>((stateObj) 

Task.Factory.StartNew((stateObj) 

को सरल किया जा सकता मैं देख सकता हूँ मैं इसे किसी भी प्रकार के बिना भी उपयोग कर सकते हैं और वी.एस. लैम्ब्डा अभिव्यक्ति वापसी से सामान्य प्रकार infers के रूप में मान प्रकार, जैसा कि नीचे है:

Task taskWithFactoryAndState = Task.Factory.StartNew((stateObj) => 
{ 
    List<int> ints = new List<int>(); 
    for (int i = 0; i < (int)stateObj; i++) 
    { 
     ints.Add(i); 
    } 
    return ints; 
}, 2000); 

लेकिन यह पहले कथन पर लागू नहीं है। इस मामले में, वीएस मुझे जेनेरिक प्रकारों को शामिल करने के लिए मजबूर करता है।

क्या आप कृपया मेरी मदद कर सकते हैं, ये दोनों अलग-अलग व्यवहार क्यों करते हैं?

enter image description here

+3

क्योंकि आपको हमेशा रचनाकारों को सामान्य तर्क प्रदान करना होगा। वही – Rob

उत्तर

3

दो कोड नमूने अलग बातें करते हैं। इसे देखने का सबसे आसान तरीका दोनों भागों के कार्य में ब्रेक-पॉइंट डालना और F5 दबाएं। यह दूसरे भाग के ब्रेक-पॉइंट को हिट करेगा, भले ही यह पहले से नीचे हो।

अब

विवरण के लिए:

पहले एक बस एक सामान्य वस्तु बनाने और उसे निर्माता आप स्पष्ट रूप से कहना होगा आप किस प्रकार का निर्माण कर रहे बुला है।

Task<List<int>> taskWithInLineAction = new Task<List<int>>(() => 
{ 
    List<int> ints = new List<int>(); 
    for (int i = 0; i < 1000; i++) 
    { 
     ints.Add(i); 
    } 
    return ints; 
}); 

तो जब आप new ... बारे में आप किस प्रकार का उल्लेख करना होगा।

हालांकि, दूसरे खंड में आप फ़ंक्शन निष्पादित कर रहे हैं जो एक ऑब्जेक्ट देता है और आप इसे एक चर के लिए असाइन कर रहे हैं।

Task<List<int>> taskWithFactoryAndState = Task.Factory.StartNew<List<int>>((stateObj) => 
{ 
    List<int> ints = new List<int>(); 
    for (int i = 0; i < (int)stateObj; i++) 
    { 
     ints.Add(i); 
    } 
    return ints; 
}, 2000); 

इस बिंदु पर कार्य को पहले ही निष्पादित कर दिया गया है और पृष्ठभूमि में चल रहा है। चूंकि आप सीधे ऑब्जेक्ट विज़ुअल स्टूडियो को तुरंत चालू नहीं कर रहे हैं, आपको बताता है कि रिटर्न प्रकार अनुमानित किया जा सकता है और इसलिए "नाम सरलीकृत किया जा सकता है"।

आप दृश्य स्टूडियो देखें, तो यह भी कहते हैं कि आप इसे await सकता है, जबकि यह पहला खंड है कि कहना नहीं है:

List<int> taskWithFactoryAndState = await Task.Factory.StartNew<List<int>>((stateObj) => 
{ 
    List<int> ints = new List<int>(); 
    for (int i = 0; i < (int)stateObj; i++) 
    { 
     ints.Add(i); 
    } 
    return ints; 
}, 2000); 
+0

@ ओमेर के लिए लागू नहीं होता है - क्या इससे आपको इस मुद्दे को समझने में मदद मिली? –

+1

आपको बहुत बहुत धन्यवाद। –

+0

@ ओमेरके - आपका स्वागत है :) –

2

सरल डिजाइन परिप्रेक्ष्य:

  • एक हैं ऑब्जेक्ट को Generic Constructor का उपयोग करके प्रारंभ किया गया है, फिर टाइप करने के लिए अनिवार्य रूप से आपूर्ति की आवश्यकता होती है और यही पैरामीटर को बहती है, जिसे उन्हें कड़ाई से पालन करने की आवश्यकता होती है
  • यदि कोई ऑब्जेक्ट Generic Method का उपयोग करके प्रारंभ किया गया है, तो विधि आउटपुट विधि का उपयोग करके परिभाषित किया जा सकता है, और इसे वापस लौटाए गए प्रकार से पालन करने की आवश्यकता है।

इस प्रकार दो मामलों

केस 1 ऊपर परिभाषित में भूमिका उत्क्रमण: का प्रयोग जेनेरिक निर्माता

प्रारंभ, Task वर्ग निर्माता का उपयोग किया जाता है कि हम सामान्य संस्करण का उपयोग कर रहे हैं के बाद से, इसलिए Task<T> कन्स्ट्रक्टर, निम्नलिखित link पर विभिन्न विकल्पों की जांच करें। महत्वपूर्ण बिंदु यह है कि Task<TResult> प्रकार Func के रूप में पैरामीटर ले रहा है TResult आउटपुट के रूप में प्रतिनिधि, जहां आउटपुट का प्रकार Task<TResult> का उपयोग करके मैप किया गया है, यही कारण है कि प्रारंभिकरण के दौरान कार्य वर्ग के प्रकार को परिभाषित करना अनिवार्य है, यह दूसरी तरफ नहीं है। पैरामीटर के रूप में Func प्रतिनिधि का उपयोग करना संभव नहीं है, जिसका रिटर्न प्रकार TResult (डिज़ाइन द्वारा) नहीं है, इस प्रकार सख्त प्रकार की जांच लागू कर रहा है। इस मामले में इस्तेमाल किया गया कन्स्ट्रक्टर निम्नलिखित है।

Task<TResult>(Func<TResult>)

केस 2: सामान्य विधि

का उपयोग करते हुए इस मामले में Task.Factory.StartNew<TResult>(Func<TResult>) विधि एक Task वस्तु है, जहां Task की वापसी प्रकार Func प्रतिनिधि और अपनी वापसी द्वारा किया जाता है बनाने के लिए प्रयोग किया जाता है टाइप करें, इस प्रकार प्रकार की जांच अभी भी लागू की गई है लेकिन इसके पहले मामले के विपरीत, इसलिए लौटाया गया कार्य Func प्रतिनिधि के समान प्रकार होना चाहिए, निम्नलिखित link

देखें

विजुअल स्टूडियो के मामले में यह कंपाइलर से बारीकियों का विवरण लेने में सक्षम है, जो यह प्रत्येक संशोधन पर चलता है और सुझाव दे सकता है कि परिवर्तन वैकल्पिक/अनिवार्य है और तदनुसार उपयोगकर्ता को कार्रवाई के लिए संकेत दिया जाता है और इस प्रकार वैकल्पिक को भूरे रंग से बाहर कर दिया जाता है कोड

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

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