C#调用带多个默认值的方法时,实参加双引号的原因及CS0103报错解析
问题解答
双引号的作用与CS0103错误原因
- 在C#中,双引号包裹的内容是字符串字面量,代表一个具体的文本值,属于合法的方法实参。比如你代码里写的
"child3",就是内容为child3的字符串常量,可以直接传给类型为string的形参。 - 如果不加双引号直接写
child3,比如调用时写MyMethod(child3),C#会将child3识别为标识符(即变量、类、方法的名称),尝试在当前调用上下文(也就是Main方法的作用域)中查找名为child3的变量。但child3只是MyMethod的内部形参,它的作用域仅在MyMethod方法内部,Main方法中根本不存在这个变量,因此会触发CS0103错误(当前上下文中不存在名称“child3”)。
当前代码的实际执行逻辑
你当前写的MyMethod("child3")存在认知偏差:
- C#调用方法时,如果没有显式指定形参名,实参将按照从左到右的位置顺序依次匹配形参。你这里仅传入了1个字符串值,会直接赋值给第一个形参
child1,剩下的child2、child3仍然使用你定义的默认值。 - 因此这段代码运行后,最终输出的是
child3的默认值John,并不是你可能误以为的“给child3参数赋值”。
单独给child3传值的正确写法
如果你不想修改前两个形参的默认值,只想给第三个形参child3传自定义值,需要使用命名参数语法:在形参名后加冒号,再接传入的字符串值:
// 仅给child3传值,child1、child2保留默认值 MyMethod(child3: "传入的自定义文本");
- 这里冒号前的
child3是形参的名称标识,不需要加双引号,因为它的作用是告知编译器要赋值的目标形参,不是要传递的字符串内容。
内容的提问来源于stack exchange,提问作者Hence
相关产品推荐
相关产品推荐

