1

我有以下方法,Resharper 告诉我这if(drivers != null)将永远是真的,但我不知道为什么,它告诉我该catch块是多余的,但有人可以解释为什么吗?这是代码:

public List<Driver> GetDrivers(int id)
        {
            if (_context != null)
            {
                try
                {
                    var drivers = _context.Drivers.Where(x=> x.id == id).ToList();


                    //Always true
                    if (drivers != null)
                    {
                        //code
                    }
                    else
                    {
                        //Heuristically unreachable
                        throw new Exception("No Driver");
                    }
                }
                catch (Exception ex)
                {
                    throw;
                }
            }

            return drivers;
        }
  1. 为什么if(drivers != null)总是正确的?驱动程序不能为空吗?如果它是正确的,我假设驱动程序的默认值不为空。
  2. 我假设它告诉 else 语句是不可访问的,因为它认为驱动程序永远不能为空,但情况是这样吗?
  3. 它告诉我这catch是多余的,但除了是 null 之外,resharper 说它不能,是否还有另一个可以引发的异常会导致catch执行?
4

3 回答 3

5

您正在使用 .Where,它返回一个集合。如果没有匹配,它将是一个空集合,因此不为空。

我认为您想使用 .SingleOrDefault 而不是 .Where。

于 2013-05-16T17:43:07.777 回答
5

那么 catch 确实是多余的,你没有在其中做任何事情,只是重新抛出完全相同的异常:

catch (Exception ex)
{
   // would make more sense if for example you're writing to log file

   // otherwise this will be thrown anyway (even without the catch)
   throw;
}

此外,这永远不会返回 null,它可能有 0 个条目,但不会为 null:

_context.Drivers.Where(x=> x.id == id).ToList();
于 2013-05-16T17:43:10.357 回答
2

try 块是多余的,因为您只是再次抛出错误而不做任何额外的处理。如果您删除try/catch异常,无论如何都会冒泡。你不需要扔它。

.Where返回一个集合。它永远不会为空,但它可能是空的。

于 2013-05-16T17:43:54.190 回答