2011-02-06 14 views
7

असाइन किए गए स्थानीय चर 'मॉडल' का उपयोग "असाइन किए गए स्थानीय चर का उपयोग"। क्या मुझे त्रुटि संदेश मिल रहा है। इसका अधिकार जहां मैं कहता हूं अगर (मॉडल == शून्य)। मुझे यकीन नहीं है कि यह मुझे एक संकलन समय क्यों दे रहा है .. कृपया कोई मदद करें।एक सामान्य विधि

public static T TryGet<T>(string fileName) where T : new() 
{ 
    T model; 
    using (var storageFile = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
     using (var stream = new IsolatedStorageFileStream(fileName, FileMode.Open, storageFile)) 
     { 
      if (stream.Length > 0) 
      { 
       var serializer = new DataContractSerializer(typeof(T)); 
       model = (T)serializer.ReadObject(stream); 
      } 
     } 
    } 
    if (model == null) 
    { 
     model = new T(); 
    } 
    return model; 
} 

उत्तर

15

त्रुटि कहता है, आप स्थानीय चर का उपयोग नहीं कर सकते हैं जब तक कि संकलक साबित न कर सके कि इसे एक मान असाइन किया गया है।

अपने मामले में, यदि आपकी if स्थिति गलत है, तो model चर निर्दिष्ट नहीं है।

आप इसे एक प्रारंभिक पहला महत्वपूर्ण बताए द्वारा समस्या का समाधान कर सकते हैं:

T model = default(T); 

ध्यान दें कि यदि T एक struct प्रकार है, model == null कभी नहीं सच हो सकता है।

आप जब स्थानीय चर के साथ काम करने

using (var storageFile = IsolatedStorageFile.GetUserStoreForApplication()) 
using (var stream = new IsolatedStorageFileStream(fileName, FileMode.Open, storageFile)) 
{ 
    if (stream.Length > 0) 
    { 
     var serializer = new DataContractSerializer(typeof(T)); 
     return (T)serializer.ReadObject(stream); 
    } 
    else 
    { 
     return new T(); 
    } 
} 
+0

अच्छा, वर्णनात्मक उत्तर। ओह-और बधाई :-) –

1

क्योंकि model एक स्थानीय चर रहा है, संकलक आपको लगता है कि त्रुटि दे रही है क्योंकि यह केवल अगर बयान में असाइन किया गया है है। यदि if स्टेटमेंट स्थिति सत्य नहीं है, तो model को कोई मान नहीं दिया जाएगा। इसे null का डिफ़ॉल्ट मान देने का प्रयास करें या इसके अलावा कोई अन्य कथन जोड़ें और model असाइन करें।

T model = null; 

स्थानीय चर स्वचालित रूप से प्रारंभ नहीं होते हैं, लेकिन उदाहरण चर हैं।

public class MyClass<T> 
{ 
    private T instanceVariable; // automatically initialized 

    public void MyMethod() 
    { 
     T localVariable; // not automatically initialized 
    } 
} 
3

कंपाइलर यह नहीं जानता कि जब तक आप इसे नहीं बताते हैं।

T model; के बजाय अधिक जानकारी के लिए का उपयोग T model = default(T);

: http://msdn.microsoft.com/en-us/library/xwth0h0d(v=vs.80).aspx

संपादित करें: एक और विकल्प सिर्फ अपने अक्रमांकन ब्लॉक से पहले करने के लिए नए बयान ले जाने के लिए है। इस तरह, आपके पास अब एक नई ऑब्जेक्ट या deserialized ऑब्जेक्ट होगा जैसा आपके पास है।

+1

इसका संदर्भ प्रकार होने के साथ कुछ लेना देना नहीं है। इसके अलावा, 'टी' एक संदर्भ प्रकार नहीं है। – SLaks

+0

@ एसएलएक्स, मुझे पोस्ट में कुछ भी नहीं दिख रहा है जो सुझाव देता है कि 'टी' संदर्भ प्रकार नहीं है। कोड अब के रूप में केवल एक मूल्य प्रकार के लिए काम करेगा। संदर्भ प्रकारों के लिए, उसे शून्य, डिफ़ॉल्ट, या एक नई वस्तु असाइन करना होगा। –

+0

जब तक आप 'टी: कक्षा' कहां लिखते हैं, 'टी' संदर्भ प्रकार नहीं है। – SLaks

3

करने के लिए अपने कोड में परिवर्तन करना चाहिए, वे हमेशा एक्सेस किए जा रहे पहले एक मूल्य सौंपा जाना चाहिए।

इसका कारण यह है कि आमतौर पर, जब डेवलपर प्रारंभिकता को छोड़ देता है, तो वह इसे रनटाइम पर निर्भर करता है ताकि वह इसे डिफ़ॉल्ट मान दे सके, लेकिन अगर वह भूल गया, तो इससे कुछ अनावश्यक बग हो सकते हैं।

जेनरिक के साथ काम करने, और नहीं निर्दिष्ट करने कि क्या आप एक ReferenceType या एक ValueType उम्मीद कर रहे हैं के मामले में, आप बस इसे null बताए द्वारा प्रारंभ नहीं कर सकते हैं। इस मामले में आपको default keyword का उपयोग करने की आवश्यकता है।

यह संदर्भ प्रकारों के लिए चर को null पर प्रारंभ करेगा, या संख्यात्मक मान प्रकारों के लिए 0 असाइन करेगा। Structs के लिए, यह प्रत्येक सदस्य को इसके डिफ़ॉल्ट में प्रारंभ करेगा।

उदाहरण आप पोस्ट में, null के साथ तुलना यदि यह मामला है, यह सबसे अच्छा है भी class बाधा जोड़ने के लिए, मुझे मान इस विधि केवल ReferenceTypes साथ प्रयोग किया जा करने के लिए होती जा सकता है की सुविधा देता है।

+0

मुझे लगता है कि सीएलआर में * सेट * तक एक अच्छी तरह से परिभाषित मूल्य नहीं हो सकता है (और सी # कंपाइलर केवल 'डिफ़ॉल्ट' में घुमाने के बजाय कोडर बनाने का मार्ग लेता है (टी) 'कहीं) - मुझे विश्वास है कि हाल ही में एक एसओ पोस्ट देखकर वैरिएबल "स्लॉट" * कुछ प्रत्यक्ष बाइटकोड के माध्यम से * एक्सेस किया जा सकता है। –

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