如何修复错误:“检测到无法访问的代码”
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 = startDate && february29 <= DateTime.Now.Date) { count++; } } } return count; String answer = GetAnswer(); Response.Write(lblAntwoord); } }
为什么我会收到错误:“检测到无法访问的代码”? – 错误显示在以下行 –
String answer = GetAnswer();
这只是因为你的代码在return语句之后。
return语句终止它出现的方法的执行,并将控制返回给调用方法。 它还可以返回一个可选值。 如果方法是void类型,则可以省略return语句。
如果return语句在try块内,则finally控件(如果存在)将在控制返回到调用方法之前执行。
http://msdn.microsoft.com/en-us/library/1h3swy84%28v=vs.100%29.aspx
解决方案(明显):
在return语句之前移动无法访问的代码。
无法访问的代码是编译器警告 ,而不是错误。 你有三个选择:
- 删除无法访问的代码。
- 停止将警告视为项目属性中的错误。
- 将return语句移动到当前无法访问的语句下方。
它是无法访问的,因为方法的流程在return
语句中退出,因此永远不会执行下面的代码。 编译器可以确定这一点,因此可以报告它。 就像我说的,这些实际上是编译器警告 ,除非您已将项目配置为将警告视为错误,否则不会停止成功构建。
return count; // here you exit this method String answer = GetAnswer(); // so you'll never get here Response.Write(lblAntwoord);
编译器会正确警告您最后一行永远不会被执行。
当你简单地将回报向下移动2行时:
String answer = GetAnswer(); Response.Write(lblAntwoord); return count;
编译错误将消失,然后您的程序将崩溃 。 由你决定为什么这两种方法不应该相互调用。
该声明:
return count;
退出function。 因此,
answer = GetAnswer(); Response.Write(lblAntwoord);
无法连接。
return语句终止函数的执行并将控制返回给调用函数。 执行将在呼叫后紧接的呼叫function中重新开始
如果函数定义中没有返回语句,则在执行被调用函数的最后一个语句后,控件将自动返回到调用函数
在您的代码中:
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