在我的项目中启用 Sonar 后,我收到以下消息
myEntities 在至少一个执行路径上为空。
public static IEnumerable<KeyValuePair<MyDto,long>> PrepareClientResponses(this IEnumerable<MyServiceCnt> myEntities)
{
if (myEntities == null || !myEntities.Any())
{
yield return default;
}
foreach (var myEntities in myEntities)
{
var client = myEntities.PrepareClientResponse();
yield return new KeyValuePair<MyDto, long>(client, myEntities.MyId.Value);
}
}
消息在
foreach (var myEntities in myEntities)
行的“myEntities”上。
有人可以建议我如何解决此消息。我正在检查 null 条件,但它仍然发出此警告。
yield return default;
yield return
大致意思是“返回一个值并在请求下一个值后继续”。
因此,即使从未达到
yield return
,循环也会执行。
要解决此问题,您有多种选择。
yield break
而不是
yield return
中的if
,您可以使用yield break
来终止方法,如解释here.
public static IEnumerable<KeyValuePair<MyDto,long>> PrepareClientResponses(this IEnumerable<MyServiceCnt> myEntities)
{
if (myEntities == null || !myEntities.Any())
{
yield return default;
yield break;
}else{
foreach (var e in myEntities)
{
var client = e.PrepareClientResponse();
yield return new KeyValuePair<MyDto, long>(client, e.MyId.Value);
}
}
}
else
你可以把循环放在一个
else
块中。这样,如果检查结果为真,它就不会被执行:
public static IEnumerable<KeyValuePair<MyDto,long>> PrepareClientResponses(this IEnumerable<MyServiceCnt> myEntities)
{
if (myEntities == null || !myEntities.Any())
{
yield return default;
}
else
{
foreach (var e in myEntities)
{
var client = e.PrepareClientResponse();
yield return new KeyValuePair<MyDto, long>(client, e.MyId.Value);
}
}
}
在某些情况下,不返回任何元素可能是一个明智的决定,以防先入之见失败。但请注意,如果您这样做,您的代码将表现不同。
public static IEnumerable<KeyValuePair<MyDto,long>> PrepareClientResponses(this IEnumerable<MyServiceCnt> myEntities)
{
if (myEntities != null && myEntities.Any())
{
foreach (var e in myEntities)
{
var client = e.PrepareClientResponse();
yield return new KeyValuePair<MyDto, long>(client, e.MyId.Value);
}
}
}
你的 foreach 循环有错误:
foreach (var myEntities in myEntities)
这是错误的,因为您在循环中使用了完全相同的变量!
应该是:
foreach (var myEntity in myEntities)
{
var client = myEntity.PrepareClientResponse();
yield return new KeyValuePair<MyDto, long>(client, myEntity.MyId.Value);
}