首页 > 解决方案 > 错误“参数是值,而参数声明为”是什么意思?

问题描述

netstandard 2.0应用程序中,我有以下方法,它是静态类的一部分:

public static class Argument 
{    
    /// <param name="inst">Inst.</param>
    /// <param name="instName">Inst name.</param>
    /// <exception cref="ArgumentException">
    /// Thrown if :
    /// <paramref name="inst" /> is not specified in a local time zone.
    /// </exception>
    public static void ThrowIfIsNotLocal(in DateTime inst, string instName)
    {
        if (inst.Kind != DateTimeKind.Local)
            throw new ArgumentException(instName, $"{instName} is not expressed in a local time-zone.");
    }
}

在我正在运行的程序中.netcore 2.0,我有以下行会产生错误:

Argument.ThrowIfIsNotLocal(DateTime.Now, "timestamp");

参数是值,而参数声明为

为什么会DateTime.Now导致出现错误?

标签: c#.net-core.net-standard-2.0

解决方案


方法签名声明参数需要通过引用传递,而不是通过值传递。这意味着您需要有某种可以引用的存储位置以传递给该方法。

属性 getter 的结果不是变量;这不是你可以参考的东西。它只是一个值,因此是错误消息。

您需要有一个变量,而不仅仅是一个值,并且in在调用方法时还需要使用关键字来指示您打算传递对变量的引用,而不仅仅是变量的值。

var now = DateTime.Now;
ThrowIfIsNotLocal(in now, "");

当然,首先没有真正的理由通过引用传递这个变量。我建议不要这样做,而只是按值传递参数。这样,当调用者只有一个值而不是变量时,他们就不需要经历所有这些。


推荐阅读