2013-07-25 27 views
-4
MediaDescription media; 
foreach(var field in fields) { 
    switch(field.Key) { 
     case FieldType.Version: 
      message.Version = Convert.ToInt32(field.Value);  
      break; 
     case FieldType.Originator: 
      message.Originator = OriginatorField.Parse(field.Value); 
      break; 
     ... 
     ... 
     case FieldType.Information: 
      if(media == null) <-- Use of local unassigned variable 
       message.Description = field.Value; 
      else media.Description = field.Value; 
      break; 
     ... 

我的意思是,爲什麼呢?編譯器應該足夠聰明,以便我預先檢查聲明,並且只有在else語句中才能訪問聲明。怎麼了?使用本地未賦值的變量 - 甚至與其他語句

+1

「編譯器應該足夠聰明」往往是一個被誤導的說法。編譯器知道一些事情,它不知道其他事情。事實是,爲它編寫一種語言和一個編譯器是很難的。在寫一篇文章時,設計師通常不會問「我們爲什麼不做X?」而是問「爲什麼我們應該*做X,是否有一個令人信服的理由,因爲它會有多難?」他們爲什麼不添加這個功能可能有很多原因,他們爲什麼要添加這個功能的原因很少。最簡單的是,如果將該變量聲明爲「MediaDescription media = null;',該錯誤是否會持續存在? – David

+0

可能的複製 - http://stackoverflow.com/q/9233000/1324033 – Sayse

回答

1

正在未分配和被指派空兩種不同狀態的局部變量。局部變量必須用某些東西(甚至是空值)進行初始化,然後才能被訪問。默認情況下,他們根本不初始化,不像class字段。

爲了比較,這個代碼不給編譯錯誤:

MediaDescription media = null; 
...  
    case FieldType.Information: 
     if(media == null) <-- Use of local unassigned variable 
      message.Description = field.Value; 
+0

哦,我不知道。分配空作品,儘管它很奇怪,因爲分配的和未分配的變量都是空的。 :/ – Atrotygma

+1

@Atrotygma,實際未分配的局部變量不爲空。他們只是,沒有分配。 – Andrei

1

我想你誤會了編譯器的消息:投訴是不是,你可能會訪問media對象的屬性,但您訪問變量本身,它不持有任何對象的引用,在所有 - 甚至沒有一個null參考。

在C#中的局部變量是不是默認初始化 - 你必須在或在第一次使用前,其初始化後明確指定他們。即使將它們與null進行比較也是不允許的。

+0

+1 - 你在我提供的複本中的答案同樣有用 – Sayse

+0

@Sayse啊,那是很久以前我甚至不記得我也回答了這個騙局! – dasblinkenlight