2

这是我目前的方法,但有时我必须处理这个问题,我想知道是否有更优雅的方法。

我有:long? LoadEntityId字段。我有一个方法,我用它作为参数:

private bool IsUsedInProduction(long? loadEntityId)

问题是LoadEntityId我什么时候实际上是空的Nullable object must have a value.

我现在要做的是:

if ((byte)cboStatus.SelectedValue == 10
    && LoadEntityId.HasValue 
    && IsUsedInProduction(LoadEntityId.Value))

但我认为应该有更好的方法来解决这个问题。

附言

看来我的解释不够清楚,所以问题是如果我:

if ((byte)cboStatus.SelectedValue == 10
        && IsUsedInProduction(LoadEntityId.Value))

(删除 LoadEntityId.HasValue 检查)当 LoadEntityId 实际上为空时,我会得到异常,如果我离开它 - 我只是在寻找一种方法来使我的代码在没有此检查的情况下工作。

4

3 回答 3

6

你使用正确的方法。

有三个选项:

1)检查 loadEntityId.HasValue 然后使用 loadEntityId.Value (你现在使用的)

2) 使用 loadEntityId.GetValueOrDefault()

if ((byte)cboStatus.SelectedValue == 10
    && IsUsedInProduction(loadEntityId.GetValueOrDefault()))

3) 使用?? 操作员

if ((byte)cboStatus.SelectedValue == 10
    && (IsUsedInProduction(loadEntityId ?? 0))
于 2013-04-09T12:14:43.137 回答
1

当您声明:

private bool IsUsedInProduction(long? loadEntityId)

实际上是一样的:

private bool IsUsedInProduction(Nullable<long> loadEntityId)

所以当你传递null给方法的时候,会创建一个 Nullable 类型的对象,其中loadEntityId.HasValueequal tofalseloadEntityId.Valuethrows 调用时会抛出 Exception ,因为 是没有值的。下面是一个合理使用 Nullable 的例子。附加信息:http: //msdn.microsoft.com/en-us/library/1t3y8s4s.aspx

定义示例:

private bool IsUsedInProduction(long? loadEntityId)
{
     if(loadEntityId.HasValue)
     {
        //do something WITH loadEntityId.Value
     } else
     {
        //do something
     }
}

调用示例:

IsUsedInProduction(null);
IsUsedInProduction(21);
IsUsedInProduction(23);
于 2013-04-09T12:22:27.733 回答
0

我不是 100% 确定你在问什么,但我认为答案可能是 ?? 操作员:

if(loadEntity ?? -1 > 0){...}

这意味着如果 loadEntity 的值为 1,则使用它,如果它为 null,则使用值 -1。

于 2013-04-09T12:12:47.117 回答