4
public partial class KalenderLeeftijd : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void calBirthDate_SelectionChanged(object sender, EventArgs e)
{

}
private string GetAnswer()
{
    DateTime birthday = calBirthDate.SelectedDate;
    TimeSpan difference = DateTime.Now.Date - birthday;
    int leapYears = CountLeapYears(birthday);

    int days = (int)difference.TotalDays - leapYears;
    int hours = (int)difference.TotalHours - leapYears * 24;

    int years = days / 365;

    String answer = String.Format("Age: {0} years", years);
    answer += Environment.NewLine;
    answer += String.Format("Days: {0}*365+{1} = {2}", years, days - years * 365, days);
    answer += Environment.NewLine;
    answer += String.Format("Days Hours: {0}*24 = {1}", hours / 24, hours);
    return answer;
}

private int CountLeapYears(DateTime startDate)
{
    int count = 0;
    for (int year = startDate.Year; year <= DateTime.Now.Year; year++)
    {
        if (DateTime.IsLeapYear(year))
        {
            DateTime february29 = new DateTime(year, 2, 29);
            if (february29 >= startDate && february29 <= DateTime.Now.Date)
            {
                count++;
            }
        }
    }
    return count;
    String answer = GetAnswer();
    Response.Write(lblAntwoord); 
}
}

「到達不能なコードが検出されました」というエラーが表示されるのはなぜですか? - エラーは次の行に表示されます -String answer = GetAnswer();

4

4 に答える 4

28

コードが return ステートメントの後にあるからです。

return ステートメントは、それが表示されているメソッドの実行を終了し、呼び出し元のメソッドに制御を返します。オプションの値を返すこともできます。メソッドが void 型の場合、return ステートメントは省略できます。

return ステートメントが try ブロック内にある場合、finally ブロックが存在する場合は、制御が呼び出し元のメソッドに戻る前に実行されます。

http://msdn.microsoft.com/en-us/library/1h3swy84%28v=vs.100%29.aspx

解決策(明らか):

到達不能コードを return ステートメントの前に移動します。

于 2012-09-21T08:42:53.750 に答える
7

到達不能なコードはコンパイラの警告であり、エラーではありません。次の 3 つのオプションがあります。

returnメソッドのフローがステートメントで終了し、以下のコードが実行されないため、到達できません。コンパイラはこれを判断できるため、それを報告できます。私が言ったように、これらは実際にはコンパイラの警告であり、警告をエラーとして扱うようにプロジェクトを構成していない限り、成功したビルドを停止しません。

于 2012-09-21T08:43:47.133 に答える
2

ステートメント:

return count;

関数を終了します。したがって、

answer = GetAnswer(); 
Response.Write(lblAntwoord);  

到達できません。

于 2012-09-21T08:43:38.693 に答える
0

returnステートメントは、関数の実行を終了し、呼び出し元の関数に制御を返します。呼び出し直後の時点で、呼び出し元の関数で実行が再開されます

関数定義にreturn ステートメントがない場合、呼び出された関数の最後のステートメントが実行された後、コントロールは自動的に呼び出し元の関数に戻ります。

あなたのコードで:

private int CountLeapYears(DateTime startDate)
{
    int count = 0;
    for (int year = startDate.Year; year <= DateTime.Now.Year; year++)
    {
        if (DateTime.IsLeapYear(year))
        {
            DateTime february29 = new DateTime(year, 2, 29);
            if (february29 >= startDate && february29 <= DateTime.Now.Date)
            {
                count++;
            }
        }
    }
    return count;//The Execution will be terminated here,the next lines will become unreachable 
    **String** answer = GetAnswer();
    Response.Write(lblAntwoord); 
}
}

MSDN リンク:

C: https://msdn.microsoft.com/en-us/library/sta56yeb.aspx

c#: https://msdn.microsoft.com/en-us/library/1h3swy84.aspx

于 2016-09-07T07:07:14.007 に答える