web-dev-qa-db-ja.com

C#のオプション/ null可能OUTパラメータ

いくつかのオーバーライドがあるメソッドがあります。より拡張されたオーバーライドの1つで、OUTパラメーターを返したいのですが、単純なオーバーライドでは返しません。例えば:

public bool IsPossible(string param1, int param2)
public bool IsPossible(string param1, int param2, out bool param3)

私が現在これを達成している方法は、次のようなものです。

public bool IsPossible(string param1, int param2) {
    bool temp;
    return IsPossible(param1, param2, out temp);
}

これを達成するためのより良い方法はありますか? null可能なoutパラメーターを使用できますか(または使用する必要がありますか)?

19
Derek Hunziker

それは私にはうまく見えます。技術的な理由から、outをオプションにすることはできません(有効なインスタンスを指す必要があります)。

17
Lucero

OP:

Null可能なoutパラメーターを使用できますか(または使用する必要がありますか)?

Null許容のoutパラメータは、あまり役に立ちません。この:

_public bool IsPossible( string param1, int param2, out bool? param3 )
{
  ...
}
_

_param3_をオプションにしません。 _param3_ isのセマンティクスを変更します。 _bool?_(別名_Nullable<bool>_)は、_param3_のドメインを2つの値(trueおよびfalse)から3に広げ、3番目の値(null)、通常は欠落/不明として解釈されます。呼び出し元は、3つすべての引数を指定する必要があります。

参照パラメーターを破棄するオーバーロード(「ドントケア」シナリオ)を提供することによってIsPossible()をオーバーロードすることは、適切な解決策です。

4
Nicholas Carey
A 'ref' or 'out' parameter cannot have a default value.

あなたがそれをした方法はちょうどいいです。申し訳ありませんが、特効薬はありません。

4
agent-j

個人的には「そのまま」でいいと思います。ただし、別のアプローチは、複合戻り値(おそらく、2つのプロパティを持つ不変の構造体)を返すことです。これは、一部の人々がoutを回避するという事実を回避します。私はそれらの人々の一人ではありません:p

質問について。実際、out/refをオプションにすることはできません。

不必要に凝ったものにしたい場合は、conposite return-typeにboolへの変換を与えて、暗黙のifテストを許可することができます。

4
Marc Gravell

C#7.0以降、破棄(_)メソッドに:

return IsPossible(param1, param2, _);

参照: https://docs.Microsoft.com/en-us/dotnet/csharp/discards

3
aaroncatlin

はい、Nullable変数は素晴らしいです。次に、このようなことを行います。

public bool? IsPossible(string param1, int param2);

var ans = IsPossible("Parm1", 1);
if (ans.HasValue)
{
   //working.
 }
1
Jethro