C# Var关键字作为c中的可选参数#
我们可以在可选参数中使用var关键字吗?关键字C# Var关键字作为c中的可选参数#,c#,C#,我们可以在可选参数中使用var关键字吗?关键字var应在声明时初始化。我不能将其用作默认参数,因为默认参数是在声明时初始化的 例如: public void MyMethod(string param, var optionalParam = string.Empty) 当我尝试这样做时,C#编译器给了我一个错误,请解释一下 错误: 上下文关键字“var”只能出现在局部变量声明中 “optionalParam”的默认参数值必须是编译时常量 您不能将var关键字用于可选参数,主要是因为您不能将
var
应在声明时初始化。我不能将其用作默认参数,因为默认参数是在声明时初始化的
例如:
public void MyMethod(string param, var optionalParam = string.Empty)
当我尝试这样做时,C#编译器给了我一个错误,请解释一下
错误:
上下文关键字“var”只能出现在局部变量声明中
“optionalParam”的默认参数值必须是编译时常量
您不能将
var
关键字用于可选参数,主要是因为您不能将var
键盘用于任何参数,甚至非可选参数<代码>变量只能用于本地方法变量,不能用于方法参数、字段或任何其他位置。这里的编译器错误是明确的
也就是说,这里还有第二个错误,编译器也解释了这一错误,即不能将可选参数的默认值设置为非常量值<代码>字符串。空的是非常量。您必须使用
null
,或者在那里显式地使用”
。首先,字符串。空的不是用const
声明的,因此它无论如何不能用作可选参数的默认值。改用“
”
虽然在这里使用var
似乎完全可以,但C#不允许这样做
根据C语言规范第10.6.1节:
方法参数方法的参数(如果有)由
方法的形式参数列表
formal-parameter-list:
fixed-parameters
fixed-parameters , parameter-array
parameter-array
fixed-parameters:
fixed-parameter
fixed-parameters , fixed-parameter
fixed-parameter:
attributes(opt) parameter-modifier(opt) type identifier default-argument(opt)
default-argument:
= expression
parameter-modifier:
ref
out
this
parameter-array:
attributes(opt) params array-type identifier
local-variable-declaration:
local-variable-type local-variable-declarators
local-variable-type:
type
var
local-variable-declarators:
local-variable-declarator
local-variable-declarators , local-variable-declarator
local-variable-declarator:
identifier
identifier = local-variable-initializer
local-variable-initializer:
expression
array-initializer
形式参数
列表由一个或多个逗号分隔的参数组成,其中
最后一个可能是参数数组固定参数由
可选属性集(§17)、可选参考、输出或此
修饰符、类型、标识符和可选的默认参数。每个
fixed parameter使用给定的
名称此修饰符将该方法指定为扩展方法
并且只允许在静态方法的第一个参数上使用。
扩展方法详见§10.6.9
注意在固定参数
语法下它是如何表示类型
?这意味着它需要一个类型,而不是var
另一方面,以下是规范中关于可以使用var
的局部变量声明的说明
第8.5.1节局部变量声明
formal-parameter-list:
fixed-parameters
fixed-parameters , parameter-array
parameter-array
fixed-parameters:
fixed-parameter
fixed-parameters , fixed-parameter
fixed-parameter:
attributes(opt) parameter-modifier(opt) type identifier default-argument(opt)
default-argument:
= expression
parameter-modifier:
ref
out
this
parameter-array:
attributes(opt) params array-type identifier
local-variable-declaration:
local-variable-type local-variable-declarators
local-variable-type:
type
var
local-variable-declarators:
local-variable-declarator
local-variable-declarators , local-variable-declarator
local-variable-declarator:
identifier
identifier = local-variable-initializer
local-variable-initializer:
expression
array-initializer
如您所见,对于局部变量类型
,它是类型
或变量
。这表明规范将type
和var
视为不同的东西。当它说type
时,它必须是一个类型,而不是var
,正如其他人所提到的,您不能在参数列表中使用var
现在还没有写规范,我不能告诉你为什么不能。然而,有一个很好的理由说明你不应该这样做
参数列表用于告诉调用该方法的人要放入什么。因此,它应该清楚地表明这一点。如果使用MyFunc(var param=Myconstant)
我不知道param应该是什么类型
我想这就是为什么var
只允许在局部变量中使用。由于局部变量不适用于程序的任何其他部分,因此如果它们没有明确说明它们是什么,那就没问题了 使用dynamic关键字或object关键字向我们显示您遇到的错误。是的,我知道我们可以使用dynamic或object,但我想知道为什么我们不能在这里使用var。string。Empty
不是常量表达式,所以您不能将其用作默认值。您可以使用const
作为可选参数,但是string.Empty
是只读字段。请尝试将其设置为string optionalParam=“
我确信它不能使用,但根据定义,它可以正确使用?。当我使用整数值时,我遇到了以下错误:“int”类型的值不能用作默认参数,因为没有到“var”类型的标准转换。不,它永远不能在参数声明中使用。这就是C#spec所说的。编译器错误就是这么说的。