C# 错误是什么;参数是值,而参数在";中声明为;什么意思?

C# 错误是什么;参数是值,而参数在";中声明为;什么意思?,c#,.net-core,.net-standard-2.0,C#,.net Core,.net Standard 2.0,在netstandard2.0应用程序中,我有以下作为静态类一部分的方法: public static class Argument { /// <param name="inst">Inst.</param> /// <param name="instName">Inst name.</param> /// <exception cref="ArgumentException"> /// Th

netstandard2.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.");
    }
}
参数是值,而参数声明为


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

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

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

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

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

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

什么类型是
参数
?@Sach这是静态类。为了清楚起见,我在问题中添加了它。在这种情况下,通过ref传递结构的原因是为了避免复制,并表明该方法不会修改值。哦。。。尝试您的解决方案更改了错误!它现在抱怨只读引用是C#7.2的一个特性。我想我必须在我的.netcore应用程序中启用C#7.2。你可以将
中的
ref
关键字之间的差异添加为(无法更改方法中传递的变量的值)@Kzrystof 1),其中涉及的类型比引用的类型大得多2)基准涉及返回一个从未使用过的值,因此,从理论上讲,整个事情可以完全忽略。这不是一个有意义的基准。同样,您的代码涉及一个不大于引用的类型,并且鉴于调用方显然并不总是拥有一个变量,这意味着他们无论如何都在做一个复制,将其放入一个变量(否则就不需要)中,仅用于此方法。我没有说在
中使用
永远都不合适,只是它不在这里。@Kzrystof这篇文章的后半部分是他们在谈论创建任何导致性能差异的示例的过程中有多么艰难也毫无价值。这应该会让你明白,这并不是你在你所有的参数上都加上的东西,而是在非常特殊的情况下加上的东西。
var now = DateTime.Now;
ThrowIfIsNotLocal(in now, "");