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