目前尚不清楚,为什么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);
}
}
答案 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
修饰符与文字一起使用; ref
和out
修饰符也不允许:
in parameter modifier (C# Reference)
与
in
一起使用的参数必须表示一个可以 直接提及。out
和ref
参数的通用规则相同 适用:您不能使用常量,普通属性或其他 产生值的表达式。
当您要使用参数in
修饰符传递给方法而没有in
修饰符的文字时,编译器将创建一个临时变量,并使用对该变量的引用来调用该方法。这样做的原因如下:
in parameter modifier (C# Reference)
在呼叫站点省略
in
会通知编译器您将允许 它创建一个临时变量以通过只读引用传递给 方法。 编译器创建一个临时变量来克服 参数中有几个限制:
- 一个临时变量允许将编译时常量作为
in
参数。- 临时变量允许使用
in
参数的属性或其他表达式。- 临时变量允许在有 从参数类型隐式转换为参数类型。
总而言之,这两个选项都是允许的,因为它们每个都有不同的使用情况,但最终,还是以只读方式引用了始终使用的变量。