1

CA1026: Default parameters should not be usedによると、私はデフォルトのパラメータを使用するはずがありません。この ルールから警告を抑制しないCA1026 - 代替、CLS準拠の方法が提供されている場合は、このメッセージを抑制できますか?

MSDNには、メッセージを抑制しないと言います。

ただし、CLSCompliantのバリ​​エーションを含めると、このメッセージは表示されませんか?または、同じメソッドに2つのバリエーションがあります.1つはすべてデフォルトパラメータ、1つは空、問題を引き起こすでしょうか?

public class Foo 
{ 
    public Foo() 
     : this(0) 
    { 
    } 

    [CLSCompliant(false)] 
    [SuppressMessage("Microsoft.Design", "CA1026:DefaultParametersShouldNotBeUsed")] 
    public Foo(Int32 id = 0) 
    { 
     //... 
    } 
} 

MSDNの提案を無視するのは間違いありませんか?私は明らかにメソッド(コンストラクタ)をCLSCompliant(false)とマークし、デフォルト値をとらないメソッド(コンストラクタ)を提供しています。


サイドノート:それは マネージコードにアクセスするときに

コンパイラは、C++のためのマネージド 拡張のため デフォルトパラメータの値を無視します:ので、これは所定の位置にあるようです。

...だから、私は技術的に今は0のパラメータを取ることができる2つのコンストラクタを持っているので、このように問題を引き起こすでしょうか?

答えて

2

実際、引数なしのコンストラクタは2つありません。デフォルト値はコンパイル時にのみ消費され、デフォルトのパラメータ値をサポートするコンパイラでは、通常、どのメソッドをターゲットにするかを決めるルールもあります。

つまり、パラメータを指定しないでオーバーライドすると、デフォルト値を指定するのはどうですか?デフォルトのパラメータ値のような主な理由は、過負荷の書き込みを気にしたくないということです。

+0

そこでMicrosoft FxCopの警告を回避する方法が不明です。 MSDNは、メッセージを抑制するのではなく、修正するように指示しています。私は中間地点を見つけようとしました。一つのメソッドをパラメータ化し、 'CLSCompliant(false)'とマークし、パラメータ化されていないメソッドを提供しています...主にデフォルト値を供給するメソッドです。次に、おそらく私はこれを行う方法を考え直す必要があります... –

+0

単にデフォルト値を削除するだけで、呼び出し元に機能が失われることなくFxCop違反が解決されます。 –

+0

デフォルトパラメータを使用せずにコールサイトを満たすことができるメソッド呼び出しが存在する場合、デフォルトパラメータは無視されます。存在しない言語がデフォルトパラメータをサポートしている場合は、そのパラメータが使用されます。言語がデフォルトパラメータをサポートしていない場合、コンパイラは*を呼び出し、呼び出し側が呼び出しサイト*で希望する値を指定する必要があります。私はデフォルトパラメータを持っている人がそれをサポートしていない言語を使用している発信者にとって有害で​​あるとは思わない。呼び出し元は、デフォルトが指定されていない場合に必要なコードと同じコードを記述するだけで済みます。 – supercat

関連する問題