2017-09-17 3 views
-1

オプションのパラメータでvarキーワードを使用できますか?キーワードvarは、宣言中に初期化する必要があります。既定のパラメータは宣言中に初期化されるため、これをデフォルトのパラメータとして使用できません。例えばcarのオプションパラメータとしてのVarキーワード

:私は、C#コンパイラは私にエラーを与えているこれをしようとすると、いくつかのいずれかを説明してください

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

エラー:

The contextual keyword 'var' may only appear within a local variable declaration

Default parameter value for 'optionalParam' must be a compile-time constant

+0

動的キーワードまたはオブジェクトキーワードを使用してください – Amit

+0

私たちにあなたが得るエラーを教示してください。 –

+0

はい私は動的またはオブジェクトを使用できることは知っていますが、ここでvarを使用する理由がわかりません。 – arun

答えて

4

あなたは、あなたが任意のパラメータについてvarキーボードを使用することができない主な理由は、オプションのパラメータのためにも:オプションパラメータをvarキーワードを使用することはできません。 varは、ローカルメソッド変数にのみ使用でき、メソッドパラメータ、フィールドなどには使用できません。ここでのコンパイラのエラーは明白で曖昧ではありません。

これは、オプションのパラメータのデフォルト値を非const値に設定することはできないという2番目のエラーもあります。 string.Emptyは非constです。 nullを使用するか、明示的に""を使用する必要があります。

+0

私はそれが使用できないと確信していますが、それは正しい意味で使用できますか?私は整数値を使用したとき、私はこのエラーを受け取りました:タイプ 'int'の値は、 'var'をタイプする標準の変換がないので、デフォルトのパラメータとして使用できません。 – arun

+1

いいえ、決してパラメータ宣言で使用することはできません。それがC#の仕様です。それはコンパイラのエラーが言っているものです。 –

1

まず、はconstと宣言されていないので、オプションのパラメータのデフォルト値として使用することはできません。代わりに""を使用してください。

ここでvarを使用しても問題ありませんが、C#ではこれを許可していません。

C#言語仕様のセクション10.6.1によると:それはfixed-parameter文法の下typeを言う方法

Method parameters The parameters of a method, if any, are declared by the method’s formal-parameter-list.

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 

The formal parameter list consists of one or more comma-separated parameters of which only the last may be a parameter-array. A fixed-parameter consists of an optional set of attributes (§17), an optional ref, out or this modifier, a type, an identifier and an optional default-argument. Each fixed-parameter declares a parameter of the given type with the given name. The this modifier designates the method as an extension method and is only allowed on the first parameter of a static method. Extension methods are further described in §10.6.9.

注意?つまり、そこにはタイプが必要です。varではありません。

一方、varが使用できるローカル変数宣言についての仕様は次のとおりです。

section 8.5.1 Local variable declarations

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のいずれかです。これは、仕様が異なるものとしてtypevarを扱うことを示しています。 typeと書かれている場合、それはタイプでなければならず、varではありません。

0

他にも言及したように、varをパラメータリストに使用することはできません。

今は仕様書を書いていないので、なぜあなたができないのかは分かりません。しかし、あなたがしてはならない非常に良い理由があります。

パラメータリストは、誰がメソッドを呼び出すのかを入力するために使用されます。その結果、そのことを明確に述べるべきです。 MyFunc(var param=Myconstant)を使用している場合は、どのタイプのパラメータが必要であるかわかりません。

私は、varがローカル変数でのみ許可されていると思います。ローカル変数は、プログラムの他の部分で使用されることは意図されていないので、明示的にそれらが何であるかを明記しなければなりません。

関連する問題