2011-11-29 194 views
2

在以下代碼中,Visual Studio將在其他字上放置錯誤消息。具體的錯誤讀取「意外'其他'」。我做錯了什麼?是什麼導致這個「Unexpected'else'」錯誤?

  decimal AmountToAccrue; 
      string BillingDescription; 


      if (PromoPeriodEnd >= day) 

       AmountToAccrue = 0; 
       BillingDescription = "Subscription 30-day Promotional Period"; 

      else 

       AmountToAccrue = subscription.Amount * ProratedPercentDue; 
       BillingDescription = "Subscription Fee"; 
+1

從它的外觀來看,我會說你必須有一個Python背景。 C#需要圍繞塊的括號。 –

回答

17

當你擁有多行if的和else的,必須使用大括號:

if (PromoPeriodEnd >= day) 
{ 
    AmountToAccrue = 0; 
    BillingDescription = "Subscription 30-day Promotional Period"; 
} 
else 
{ 
    AmountToAccrue = subscription.Amount * ProratedPercentDue; 
    BillingDescription = "Subscription Fee"; 
} 

附加信息:

沒有花括號只剩下一聲明,不在線範圍內考慮。

OK:

if (PromoPeriodEnd >= day) 
    AmountToAccrue = 0; 
else 
    AmountToAccrue = subscription.Amount * ProratedPercentDue; 

不正常:

if (PromoPeriodEnd >= day) 
    AmountToAccrue = 0; 
    BillingDescription = "Subscription 30-day Promotional Period"; 
else 
    AmountToAccrue = subscription.Amount * ProratedPercentDue; 
    BillingDescription = "Subscription Fee"; 

的 「不正常」 的例子就是由編譯器這樣看待:

//Begin if statement 
if (PromoPeriodEnd >= day) 
    AmountToAccrue = 0; 
//End if statement 

//Set BillingDescription (outside of the else scope) 
BillingDescription = "Subscription 30-day Promotional Period"; 

//Begin else statement - ERROR! Where is the matching if? 
else 
    AmountToAccrue = subscription.Amount * ProratedPercentDue; 

//Set BillingDescription(outside of the else scope) - error above - never reached 
BillingDescription = "Subscription Fee"; 
+2

+1對初學者來說是一個很好的解釋。 – Fischermaen

+0

謝謝。只是好奇,這個頁面上的例子是不正確的http://www.blackwasp.co。英國/ CSharpVariableScopes.aspx?他們似乎遵循了與我使用完全相同的語法。實際上,我之前在我的代碼中使用了花括號,然後試圖省略它們以使得我的變量超出if/else語句的範圍。 – hughesdan

+0

@hughesdan,例子是正確的。請參閱上文 - 它可能有助於澄清區別。 –

4

你需要大括號,因爲你有一個複合臺爲if和其他身體提供幫助。

 if (PromoPeriodEnd >= day) 
     { 
      AmountToAccrue = 0; 
      BillingDescription = "Subscription 30-day Promotional Period"; 
     } 
     else 
     { 
      AmountToAccrue = subscription.Amount * ProratedPercentDue; 
      BillingDescription = "Subscription Fee"; 
     } 

if條件後的下一條語句是條件爲真時執行的條件。這可以是一個語句,也可以是一個複合語句(用大括號括起來的一系列語句)。

因爲你沒有花括號,它是將其解釋爲:

 if (PromoPeriodEnd >= day) 
      AmountToAccrue = 0; // This is the body of the if 

     // this is outside of the if 
     BillingDescription = "Subscription 30-day Promotional Period"; 

     // this token makes no sense here because it is not after the if body. 
     else 

      AmountToAccrue = subscription.Amount * ProratedPercentDue; 

     BillingDescription = "Subscription Fee"; 

其實,這就是爲什麼許多編碼標準,建議您始終使用與控制語句大括號,所以如果它是從一個改變一個語句的主體到一個複合語句主體後,這種類型的錯誤不會出現。

1

看來你缺乏一些括號:

 if (PromoPeriodEnd >= day) 
     { 
      AmountToAccrue = 0; 
      BillingDescription = "Subscription 30-day Promotional Period"; 
     } 
     else 
     { 
      AmountToAccrue = subscription.Amount * ProratedPercentDue; 
      BillingDescription = "Subscription Fee"; 
     } 

在C#中,因爲在大多數(全部?)C的語言,那些大括號定義代碼塊。這些代碼塊非常重要 - 它們還定義變量範圍(請參閱Eric的評論),因此請確保您瞭解它們。

+1

請注意,塊定義*範圍* - 實體可能按名稱引用的文本區域 - 但它們不一定定義*生存期* - 存儲位置有效的時間段。首先,lambda的封閉外部變量的生命週期可能會超出控制範圍內的時間。和迭代器或異步塊中的本地人一樣。其次,允許優化程序使本地化程序的生命週期長於或短於控制範圍。 **您無法安全地將範圍等同於使用期限。** –

+0

@EricLippert:感謝您指出。修復了我的迴應。 – mnemosyn

0

爲多,你應該使用括號

 if (PromoPeriodEnd >= day){ 

      AmountToAccrue = 0; 
      BillingDescription = "Subscription 30-day Promotional Period"; 
      } 
     else { 

      AmountToAccrue = subscription.Amount * ProratedPercentDue; 
      BillingDescription = "Subscription Fee"; 
      } 
1

當你不使用大括號,它只能識別第一個語句...所以你的代碼變得這個

if (PromoPeriodEnd >= day) { 
    AmountToAccrue = 0; 
} 
BillingDescription = "Subscription 30-day Promotional Period"; 
else { 
    AmountToAccrue = subscription.Amount * ProratedPercentDue; 
} 
BillingDescription = "Subscription Fee"; 

這當然是不是它期待什麼,甚至對新手來說也是很愚蠢:)

相關問題