2011-02-06 60 views
7

使用未分配的本地變量「模型」。是我收到了什麼錯誤信息。它的權利,我說如果(模型== null)。我不知道爲什麼它給我一個編譯時間錯誤..有人請幫助。通用方法中的「使用未分配的本地變量」

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條件爲false,則從不分配model變量。

可以通過分配它首先看重的初始解決的問題:

T model = default(T); 

注意,如果T是一個結構類型,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(); 
    } 
} 
1

因爲model是一個局部變量,編譯器給你的錯誤,因爲它是在if語句只分配。如果if語句條件不成立,model將不會被賦值。嘗試給它一個默認值null或添加一個else語句並在其中指定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

編輯:另一種選擇是你的反序列化塊之前只移動新語句。這樣,你可以有一個新的對象或反序列化的對象,就像現在一樣。

+1

這與作爲參考類型無關。另外,`T`不是參考類型。 – SLaks 2011-02-06 00:31:52

+0

@SLaks,我沒有看到帖子中的任何內容,暗示「T」不是引用類型。現在的代碼只適用於值類型。對於引用類型,他必須分配空值,默認值或新對象。 – 2011-02-06 00:34:00

+0

除非你寫`where T:class`,`T`不是引用類型。 – SLaks 2011-02-06 00:35:24

3

當與局部變量的工作,他們必須總是被訪問之前賦值。

之所以這樣,是因爲通常情況下,當開發者忽略初始化時,他依賴運行時爲其分配默認值,但在他忘記的情況下,這會導致一些不必要的錯誤。

與仿製藥的工作,而不是指定是否你期待一個ReferenceTypeValueType的情況下,你不能簡單地通過分配null初始化。 在這種情況下,您需要使用default keyword

這將初始化變量爲null作爲參考類型,或者爲數字值類型分配0。對於結構體,它會將每個成員初始化爲默認值。

在您發佈的示例中,與null的比較讓我認爲此方法可能只用於ReferenceTypes,如果是這種情況,最好也添加class約束。

相關問題