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

时间:2017-09-17 07:27:16

标签: c#

我们可以在方法可选参数中使用var关键字吗?关键字var应在声明时初始化。我不能将此作为默认参数使用,因为默认参数在声明时初始化。

例如:

public void MyMethod(string param, var optionalParam = string.Empty) 

当我尝试这样做时,C#编译器给我一个错误,请解释一下。

错误:

  

上下文关键字' var'可能只出现在局部变量声明

中      

' optionalParam'的默认参数值必须是编译时常量

3 个答案:

答案 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。这表明规范将typevar视为不同的内容。当它显示type时,它必须是类型,而不是var

答案 2 :(得分:0)

正如其他人所说,你不能在参数列表中使用var

现在没有编写规范,我无法告诉你为什么你不能。但是,你有理由不这样做。

参数列表用于告诉调用方法的人输入什么。因此,它应该清楚地说明。如果你使用MyFunc(var param=Myconstant)我不知道param应该是什么类型。

我猜这就是为什么var只允许在局部变量中使用。由于局部变量不打算被程序的任何其他部分使用,如果它们没有明确说明它们是什么,那么它就没有问题。