C# Var关键字作为c中的可选参数#

C# Var关键字作为c中的可选参数#,c#,C#,我们可以在可选参数中使用var关键字吗?关键字var应在声明时初始化。我不能将其用作默认参数,因为默认参数是在声明时初始化的 例如: public void MyMethod(string param, var optionalParam = string.Empty) 当我尝试这样做时,C#编译器给了我一个错误,请解释一下 错误: 上下文关键字“var”只能出现在局部变量声明中 “optionalParam”的默认参数值必须是编译时常量 您不能将var关键字用于可选参数,主要是因为您不能将

我们可以在可选参数中使用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所说的。编译器错误就是这么说的。