当 "switch-case" 中有 return 语句时,如何避免 Dart 中的 "no return" 警告?
How to avoid "no return" warning in Dart when there is a return statement in "switch-case"?
我创建了一个代表不同可能间隔的枚举:
enum Interval { day, week, month, year }
在方法 _changePeriod 中,我涵盖了所有可能的情况,但我仍然收到警告“此函数的 return 类型为 'DateRange',但不以 return 声明。
DateRange _changePeriod(DateRange range, int change) {
DateTime newMoment = change == -1
? range.startHour.subtract(Duration(hours: 1))
: range.finalHour.add(Duration(hours: 1));
switch (range.interval) {
case Interval.day:
{
return DateRange.day(newMoment);
}
case Interval.week:
{
return DateRange.week(newMoment);
}
case Interval.month:
{
return DateRange.month(newMoment);
}
case Interval.year:
{
return DateRange.year(newMoment);
}
}
}
我知道这“只是”一个警告,但是否有任何选项可以编写更好的代码并更正它?
要么添加一个default
语句,然后添加一个return
,要么在切换结束后return
一个默认值:
方法一:
DateRange _changePeriod(DateRange range, int change) {
DateTime newMoment = change == -1
? range.startHour.subtract(Duration(hours: 1))
: range.finalHour.add(Duration(hours: 1));
switch (range.interval) {
case Interval.day:
return DateRange.day(newMoment);
case Interval.week:
return DateRange.week(newMoment);
case Interval.month:
return DateRange.month(newMoment);
case Interval.year:
return DateRange.year(newMoment);
default:
return null; // or some value
}
}
方法二:
DateRange _changePeriod(DateRange range, int change) {
DateTime newMoment = change == -1
? range.startHour.subtract(Duration(hours: 1))
: range.finalHour.add(Duration(hours: 1));
switch (range.interval) {
case Interval.day:
return DateRange.day(newMoment);
case Interval.week:
return DateRange.week(newMoment);
case Interval.month:
return DateRange.month(newMoment);
case Interval.year:
return DateRange.year(newMoment);
}
return null; // or some value
}
另一种方法是,当您处理 enum
案例时,您可以确保针对特定 enum
.[=18= 检查每个 case
中的所有可能值]
这是 https://github.com/dart-lang/sdk/issues/35710。它将通过 Dart 即将推出的空安全改进来修复(预计在 Dart 2.12 变得稳定时)。在空安全之前,分析器无法判断 switch
表达式永远不会为空,因此无法断定 switch
块之后的代码无法访问。
同时,由于 switch
语句之后的代码在逻辑上应该是不可访问的(假设 switch
表达式不应该是 null
),我只是 throw
一个错误:
DateRange _changePeriod(DateRange range, int change) {
...
switch (range.interval) {
case Interval.day:
return DateRange.day(newMoment);
case Interval.week:
return DateRange.week(newMoment);
case Interval.month:
return DateRange.month(newMoment);
case Interval.year:
return DateRange.year(newMoment);
}
throw AssertionError('Unknown interval: ${range.interval}');
}
我创建了一个代表不同可能间隔的枚举:
enum Interval { day, week, month, year }
在方法 _changePeriod 中,我涵盖了所有可能的情况,但我仍然收到警告“此函数的 return 类型为 'DateRange',但不以 return 声明。
DateRange _changePeriod(DateRange range, int change) {
DateTime newMoment = change == -1
? range.startHour.subtract(Duration(hours: 1))
: range.finalHour.add(Duration(hours: 1));
switch (range.interval) {
case Interval.day:
{
return DateRange.day(newMoment);
}
case Interval.week:
{
return DateRange.week(newMoment);
}
case Interval.month:
{
return DateRange.month(newMoment);
}
case Interval.year:
{
return DateRange.year(newMoment);
}
}
}
我知道这“只是”一个警告,但是否有任何选项可以编写更好的代码并更正它?
要么添加一个default
语句,然后添加一个return
,要么在切换结束后return
一个默认值:
方法一:
DateRange _changePeriod(DateRange range, int change) {
DateTime newMoment = change == -1
? range.startHour.subtract(Duration(hours: 1))
: range.finalHour.add(Duration(hours: 1));
switch (range.interval) {
case Interval.day:
return DateRange.day(newMoment);
case Interval.week:
return DateRange.week(newMoment);
case Interval.month:
return DateRange.month(newMoment);
case Interval.year:
return DateRange.year(newMoment);
default:
return null; // or some value
}
}
方法二:
DateRange _changePeriod(DateRange range, int change) {
DateTime newMoment = change == -1
? range.startHour.subtract(Duration(hours: 1))
: range.finalHour.add(Duration(hours: 1));
switch (range.interval) {
case Interval.day:
return DateRange.day(newMoment);
case Interval.week:
return DateRange.week(newMoment);
case Interval.month:
return DateRange.month(newMoment);
case Interval.year:
return DateRange.year(newMoment);
}
return null; // or some value
}
另一种方法是,当您处理 enum
案例时,您可以确保针对特定 enum
.[=18= 检查每个 case
中的所有可能值]
这是 https://github.com/dart-lang/sdk/issues/35710。它将通过 Dart 即将推出的空安全改进来修复(预计在 Dart 2.12 变得稳定时)。在空安全之前,分析器无法判断 switch
表达式永远不会为空,因此无法断定 switch
块之后的代码无法访问。
同时,由于 switch
语句之后的代码在逻辑上应该是不可访问的(假设 switch
表达式不应该是 null
),我只是 throw
一个错误:
DateRange _changePeriod(DateRange range, int change) {
...
switch (range.interval) {
case Interval.day:
return DateRange.day(newMoment);
case Interval.week:
return DateRange.week(newMoment);
case Interval.month:
return DateRange.month(newMoment);
case Interval.year:
return DateRange.year(newMoment);
}
throw AssertionError('Unknown interval: ${range.interval}');
}