web-dev-qa-db-ja.com

C#オプションパラメータのデフォルト値の設定

オプションのパラメータのデフォルト値をリソースファイル内の何かに設定しようとすると、コンパイル時に次のエラーが発生します。

'message'のデフォルトのパラメータ値は、コンパイル時定数でなければなりません。

これを可能にするためにリソースファイルの動作を変更する方法はありますか?

public void ValidationError(string fieldName, 
                            string message = ValidationMessages.ContactNotFound)

この場合、ValidationMessagesはリソースファイルです。

23
Jaxidian

いいえ、デフォルトでリソースを直接機能させることはできません。あなたがする必要があるのは、デフォルト値をnullのようなものに設定し、パラメータがメソッドの本体にデフォルト値を持っているときにリソースルックアップを実行することです。

12
Tom Cabanski

1つのオプションは、デフォルト値をnullにして、それを適切に設定することです。

public void ValidationError(string fieldName, string message = null)
{
    string realMessage = message ?? ValidationMessages.ContactNotFound;
    ...
}

もちろん、これはnullを真の値として許可したくない場合にのみ機能します。

別の潜在的なオプションは、リソースに基づいてconst文字列でいっぱいのファイルを作成するビルド前のステップを持つことです。次に、それらの定数を参照できます。しかし、それはかなり厄介でしょう。

15
Jon Skeet

もう1つのオプションは、メソッドを2つに分割し、次のように一方のオーバーロードでもう一方を呼び出すことです。

public void ValidationError(string fieldName)
{ 
    ValidationError(fieldName, ValidationMessages.ContactNotFound);
}

public void ValidationError(string fieldName, string message)
{
    ...
}

この方法では、nullをそのパラメーターの有効な値でもある場合に、messageの値として渡すこともできます。

12
Adi Lester