代码之家  ›  专栏  ›  技术社区  ›  Erik Funkenbusch

这真的是一个可能的异常吗?

  •  1
  • Erik Funkenbusch  · 技术社区  · 15 年前

    var data = from d in dc.GAMEs
        where (d.GAMEDATE + d.GAMETIME.Value.TimeOfDay) >= DateTime.Now
            && d.GAMESTAT == 'O' && d.GAMETYPE == 0 select d;
    

    Resharper在蓝色的“d.GAMETIME.Value.TimeOfDay”下面加了下划线,告诉我这可能是System.InvalidOperationException。虽然我知道如果它是C代码,引用值而不检查它是否有值会是这样,但我不确定Linq查询是否是这样。

    (暂时忽略其他问题,例如它是否返回预期结果)

    经过进一步思考,我可以看到上面的内容如何导致LinqToObjects查询中的异常,以及其他类型(XML?)的异常。所以是的,我想雷斯哈珀只是为了安全。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Steven    15 年前

    在处理表达式树(如这个linqtosql查询)时,它完全取决于所使用的LINQ提供程序(在您的例子中是linqtosql)。因此,Resharper几乎不可能对您的查询说任何有用的话。我想它只是把这段代码解释为普通的C#委托。我认为可以忽略它,但也许可以为下一个开发人员添加一条评论。

        2
  •  0
  •   Igor Zevaka    15 年前

    在没有看到数据模式的情况下,我的猜测是 GAMETIME Nullable<DateTime> -即映射到数据库中可以为空的datetime/time字段。Resharper只是给您一个静态分析警告,您正在引用它 Nullable<T>.Value 不检查它是否有值。

    var data = from d in dc.GAMEs
        where (d.GAMEDATE + (d.GAMETIME.HasValue ? d.GAMETIME.TimeOfDay : new TimeSpan())) >= DateTime.Now
            && d.GAMESTAT == 'O' && d.GAMETYPE == 0 select d;
    

    游戏时间

    考虑到这一点 GAMEDATE 是不可为空的数据库字段,并且 游戏时间 NULL 价值观。

    编辑 我刚刚确认了 可为空<T>。价值 真的扔吗 InvalidOperationException ,不是 NullReferenceException

    horse's mouth

    可为空的结构是HasValue 和价值属性。如果HasValue 可为空对象的属性为 如果是,则对象的值可以是 使用Value属性访问。 尝试访问值 属性抛出 InvalidOperationException无效操作异常