我们可以在方法可选参数中使用var关键字吗?关键字var
应在声明时初始化。我不能将此作为默认参数使用,因为默认参数在声明时初始化。
例如:
public void MyMethod(string param, var optionalParam = string.Empty)
当我尝试这样做时,C#编译器给我一个错误,请解释一下。
错误:
上下文关键字' var'可能只出现在局部变量声明
中' optionalParam'的默认参数值必须是编译时常量
答案 0 :(得分:4)
您不能将var
关键字用于可选参数,主要是因为您不能将var
键盘用于任何参数,甚至非 -optional参数。 var
只能用于本地方法变量,不能用于方法参数,字段或任何其他位置。这里的编译器错误清晰且明确。
那就是说,你有第二个错误,也有编译器解释,你不能将可选参数的默认值设置为非const值。 string.Empty
是非常量的。您必须使用null
,或明确""
。
答案 1 :(得分:1)
首先,String.Empty
未使用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
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
形式参数 list由一个或多个以逗号分隔的参数组成 最后一个可能是参数数组。 固定参数由a组成 可选的属性集(第17节),可选的ref,out或this 修饰符,类型,标识符和可选的默认参数。每 fixed-parameter使用给定的参数声明给定类型的参数 名称。 this修饰符将该方法指定为扩展方法 并且只允许在静态方法的第一个参数上使用。 扩展方法在§10.6.9中进一步描述。
请注意语法下的
type
怎么说?这意味着它需要一种类型,而不是fixed-parameter
。
另一方面,这里是关于可以使用var
的局部变量声明的规范。
第8.5.1节局部变量声明
var
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
正如您所看到的,对于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
,它可以是或
local-variable-type
。这表明规范将type
和var
视为不同的内容。当它显示type
时,它必须是类型,而不是var
。
答案 2 :(得分:0)
正如其他人所说,你不能在参数列表中使用var
。
现在没有编写规范,我无法告诉你为什么你不能。但是,你有理由不这样做。
参数列表用于告诉调用方法的人输入什么。因此,它应该清楚地说明。如果你使用MyFunc(var param=Myconstant)
我不知道param应该是什么类型。
我猜这就是为什么var
只允许在局部变量中使用。由于局部变量不打算被程序的任何其他部分使用,如果它们没有明确说明它们是什么,那么它就没有问题。