c# - 错误 "argument is value while parameter is declared as in"是什么意思?

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

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");

argument is value while parameter is declared as in

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

最佳答案

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

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

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

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

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

关于c# - 错误 "argument is value while parameter is declared as in"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51830808/

相关文章:

c# - 以类型泛型/不可知的方式实现泛型方法的最佳方法

c# - 无法为 UpdatePanel 中的触发器找到具有 ID 的控件

c# - 将 .net Framework 项目与 .net Core 项目(和语言)混合 - System.IO.FileNotFoundException

Azure Functions不生成extensions.json

c# - 将 Socket.ReceiveAsync 替换为 NetworkStream.ReadAsync(可等待)

c# - 简单的伪随机算法

c# - 试图找出模型和 DbContext : 'Employee' 的 EntityFramework 元数据

c# - .Net Web Api 2.2 端点中的依赖注入(inject)不可用

c# - 为 Microsoft.EntityFrameworkCore.Install 检测到版本冲突