如何在属性上抛出 ArgumentNullException

How to throw an ArgumentNullException on a property

我有一个方法可以检查属性是否为 null。我知道如何在对象为 null 时抛出 arguement null 异常,但如何为对象的属性抛出 arguementnullexception。

private int CalculateCompletedDateDiff(Recall recall)
{
    if (!recall.StartDate.HasValue)
    {
        throw new ArgumentNullException("recall.StartDate");
    }

    //calculate and return
}

我正在使用 resharper,recall.StartDate 下有一个紫色的曲线,表示无法解析符号。那么,如果 StartDate 不能为 null,那么在 startdate 属性上抛出 arguementnull 异常的正确方法是什么?

如果参数 (recall) 不为空,则不应抛出 ArgumentNullException。当参数有问题而不是 null 时,这里只用 ArgumentException 是合适的:

if (recall == null)
{
    throw new ArgumentNullException("recall");
}
if (recall.StartDate == null)
{
    throw new ArgumentException("StartDate of recall must not be null",
                                "recall");
}

ReSharper 可能 建议您在取消引用之前对 recall 进行空引用检查?也许是这样的:

if (recall == null)
    throw new ArgumentNullException("recall");
if (!recall.StartDate.HasValue)
    throw new ArgumentNullException("recall.StartDate");

不过,从语义上讲,我不确定这是否真的是 ArgumentNullException 的正确用法。因为 StartDate 不是该方法的参数。这可能是个人意见,但我建议将 StartDate 有效性的逻辑放入 Recall 对象本身。当然,从问题中并不知道定义它的逻辑,所以在这一点上它真的只是大声思考。