C# 用“传递文字”;在;参数修改器

C# 用“传递文字”;在;参数修改器,c#,C#,不清楚为什么C#不允许调用在参数修饰符中同时传递文本的方法;同时,当文本在参数修饰符中不使用传递给方法时,代码将编译 下面是一个演示此行为的代码示例(C#7.3): 类程序 { 静态void Main(字符串[]参数) { string s=string.Empty; //这两行代码可以编译 WriteStringToConsole(以s为单位); WriteStringToConsole(“我的字符串”); //错误CS8156无法在此上下文中使用表达式,因为它可能无法通过引用传递或返回 Wr

不清楚为什么C#不允许调用在参数修饰符中同时传递文本的方法;同时,当文本在参数修饰符中不使用
传递给方法时,代码将编译

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

类程序
{
静态void Main(字符串[]参数)
{
string s=string.Empty;
//这两行代码可以编译
WriteStringToConsole(以s为单位);
WriteStringToConsole(“我的字符串”);
//错误CS8156无法在此上下文中使用表达式,因为它可能无法通过引用传递或返回
WriteStringToConsole(在“我的字符串”中);
}
公共静态void WriteStringToConsole(以字符串s为单位)
{
控制台。写入线(s);
}
}
如中所述,不能将关键字中带有
的常量用作参数:

与中一起使用的参数必须表示可以直接引用的位置。out和ref参数的一般规则相同:不能使用常量、普通属性或其他生成值的表达式

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

有关在
参数中正确使用的方法,您可以参考下面的答案


很明显,当使用
in
参数修饰符调用方法时,
in
修饰符不能与文本一起使用;
ref
out
修饰符也不允许:

中的
一起使用的参数必须表示可以
直接提到。
out
ref
参数的一般规则相同 应用:不能使用常量、普通属性或其他属性 产生值的表达式

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

在调用站点省略
中的
,将通知编译器您将允许
创建一个临时变量以只读引用方式传递给
方法编译器创建一个临时变量来克服
参数中有几个限制条件

  • 临时变量允许编译时常量作为
参数中的

  • 临时变量允许在
  • 参数中使用
    的属性或其他表达式
    
  • 临时变量允许存在 从参数类型到参数类型的隐式转换

  • 总而言之,这两个选项都是允许的,因为它们每个都有不同的用例,但最终还是会使用对变量的只读引用。

    in关键字会导致参数按引用传递。它使形式参数成为参数的别名,参数必须是变量。@Goodsmaritan您可能应该在注释中添加引用的链接。在调用方法中不需要“in”。方法声明中只需要它。“in”的唯一含义是防止传递文本和属性。如果你不想阻止它,就不要使用它。
           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);
            }