可为空的对象必须具有值错误

本文关键字:错误 对象 | 更新日期: 2023-09-27 18:33:34

我已经在这里多次看到这个问题,但我认为我不理解解决方案,因为它与我的问题有关。

我在这一行得到异常:

return CurrentCompany.ParentCompanyId == null 
    ? (Guid)CurrentCompany.ParentCompanyId 
    : CurrentCompanyID;

以下是更多代码:

/// Return the current company id, unless this is a child company id, 
/// then return the parent company id.
private Guid MainCompanyID
{
    get
    {
        return CurrentCompany.ParentCompanyId == null 
            ? (Guid)CurrentCompany.ParentCompanyId 
            : CurrentCompanyID;
    }
}

如果需要,我很乐意分享更多,但这是关于堆栈跟踪的范围。

可为空的对象必须具有值错误

在确认ParentCompanyId null后,您正在使用它。
在这种情况下,您希望使用CurrentCompanyID

这:

return CurrentCompany.ParentCompanyId == null 
    ? (Guid)CurrentCompany.ParentCompanyId : CurrentCompanyID;

应该是这样的:

return CurrentCompany.ParentCompanyId != null 
    ? (Guid)CurrentCompany.ParentCompanyId : CurrentCompanyID;

注意 == 现在!= 。 你基本上只是想扭转条件。

由于您的CurrentCompany.ParentCompanyId可为空,因此您也可以使用如下所示的null-coalescing operator -??

private Guid MainCompanyID
{
    get
    {
        return (Guid)(CurrentCompany.ParentCompanyId ?? CurrentCompanyID);
    }
}

您正在检查 null 并使用它。应该是!=

private Guid MainCompanyID
{
    get
    {
        return CurrentCompany.ParentCompanyId != null ? (Guid)CurrentCompany.ParentCompanyId : CurrentCompanyID;
    }
}

这可以很容易地使用空集合运算符??重写为以下内容(如果parentId是Guid?,CurrentCompanyID是Guid)

private Guid MainCompanyID
{
    get
    {
        return CurrentCompany.ParentCompanyId ?? CurrentCompanyID;
    }
}

您的三元运算符有问题。这一行:

return CurrentCompany.ParentCompanyId == null ? (Guid)CurrentCompany.ParentCompanyId : CurrentCompanyID;

基本上翻译为:

if (CurrentCompany.ParentCompanyId == null) 
    return (Guid)CurrentCompany.ParentCompanyId
else
    return CurrentCompanyID;

所以问题是你试图在这里将 null 转换为 Guid。您需要扭转您的状况:

return CurrentCompany.ParentCompanyId != null ? (Guid)CurrentCompany.ParentCompanyId : CurrentCompanyID;

?运算符最容易缩短为:

booleanValue ? resultIfTrue : resultIfFalse;

其中真和假结果必须属于同一类型。

查看您的代码:

CurrentCompany.ParentCompanyId == null         //booleanValue
        ? (Guid)CurrentCompany.ParentCompanyId //resultIfTrue
        : CurrentCompanyID;                    //resultIfFalse

这意味着,当您已验证 ParentCompanyId 为 null 时,您正在尝试返回它。 我猜你想反其道而行之。 为此,您需要更改布尔表达式以检查是否为 null:

CurrentCompany.ParentCompanyId != null         //booleanValue
        ? (Guid)CurrentCompany.ParentCompanyId //resultIfTrue
        : CurrentCompanyID;                    //resultIfFalse

或者,您可以保持布尔表达式不变并切换返回值的顺序:

CurrentCompany.ParentCompanyId == null         //booleanValue
        ? CurrentCompanyID                     //resultIfTrue
        : (Guid)CurrentCompany.ParentCompanyId;//resultIfFalse

两者都应该正常工作。