使用“ in”参数修饰符传递文字

时间:2019-11-18 11:29:05

标签: c#

目前尚不清楚,为什么C#不允许调用将文字与in参数修饰符一起传递的方法;同时,当文字直接传递给没有in参数修饰符的方法时,代码将进行编译。

这是一个演示此行为的代码示例(C#7.3):

class Program
{
    static void Main(string[] args)
    {
        string s = string.Empty;

        //These two lines compile 
        WriteStringToConsole(in s);
        WriteStringToConsole("my string");

        //Error CS8156  An expression cannot be used in this context because it may not be passed or returned by reference 
        WriteStringToConsole(in "my string");
    }

    public static void WriteStringToConsole (in string s)
    {
        Console.WriteLine(s);
    }
}

3 个答案:

答案 0 :(得分:5)

C# language reference中所指定,您不能使用带有in关键字作为参数的常量:

  

与in一起使用的参数必须表示可以直接引用的位置。适用于out和ref参数的通用规则:不能使用常量,普通属性或其他产生值的表达式。

答案 1 :(得分:1)

在C#7.2中,引入了“输入参数”,该参数允许传递变量的只读引用。在C#7.2之前,我们使用“ ref”和“ out”关键字来传递变量的引用。 “ Out”仅用于输出,而“ ref”则用于输入和输出。但是,如果我们必须传递一个只读引用,即将一个变量仅作为输入传递,那么就没有直接的选择。因此,在C#7.2中,为此目的引入了“在参数中”

您可以参考以下答案以获得正确使用 in 参数

https://stackoverflow.com/a/52825832/3992001

       static void Main(string[] args)
        {
            WriteStringToConsole("test"); // OK, temporary variable created.
            string test = "test";
            WriteStringToConsole(test); // OK, temporary int created with the value 0
            WriteStringToConsole(in test); // passed by readonly reference, explicitly using `in`
            //Not allowed
            WriteStringToConsole(in "test"); //Error CS8156  An expression cannot be used in this context because it may not be passed or returned by reference

        }
        static void WriteStringToConsole(in string argument)
        {
            Console.WriteLine(argument);
        }

答案 2 :(得分:0)

很明显,为什么在使用in参数修饰符调用方法时,不能将in修饰符与文字一起使用; refout修饰符也不允许:

in parameter modifier (C# Reference)

in一起使用的参数必须表示一个可以 直接提及。 outref参数的通用规则相同 适用:您不能使用常量,普通属性或其他 产生值的表达式。

当您要使用参数in修饰符传递给方法而没有in修饰符的文字时,编译器将创建一个临时变量,并使用对该变量的引用来调用该方法。这样做的原因如下:

in parameter modifier (C# Reference)

在呼叫站点省略in会通知编译器您将允许 它创建一个临时变量以通过只读引用传递给 方法。 编译器创建一个临时变量来克服 参数中有几个限制

  • 一个临时变量允许将编译时常量作为in参数。
  • 临时变量允许使用in参数的属性或其他表达式。
  • 临时变量允许在有 从参数类型隐式转换为参数类型。

总而言之,这两个选项都是允许的,因为它们每个都有不同的使用情况,但最终,还是以只读方式引用了始终使用的变量。