NULL可能なint
をint
に変換する方法以下のように2種類のintがあるとします。
int? v1;
int v2;
v1
の値をv2
に代入したいです。 v2 = v1;
はエラーを引き起こします。 v1
をv2
に変換するにはどうすればいいですか?
他の答えはこれまでのところすべて正しいです。もう少しクリーンなものをもう1つ追加したいと思いました。
v2 = v1 ?? default(int);
どのNullable<T>
も暗黙的にそのT
に変換できます。つまり、評価される式全体がValueTypeへのNULL代入をもたらすことは決してあり得ないということです。そのため、null合体演算子??
は、3項演算子の単なる構文糖衣です。
v2 = v1 == null ? default(int) : v1;
...これは、if/elseの構文シュガーです。
if(v1==null)
v2 = default(int);
else
v2 = v1;
また、.NET 4.0以降、Nullable<T>
には "GetValueOrDefault()"メソッドがあります。これは、基本的に上記のnull合体を実行するnullセーフgetterであるため、これも機能します。
v2 = v1.GetValueOrDefault();
このような、
if(v1.HasValue)
v2=v1.Value
代入にはValueプロパティを使用できます。
v2 = v1.Value;
あなたが必要なのは..
v2= v1.GetValueOrDefault();
v1
に値があることがわかっている場合は、Value
プロパティを使用できます。
v2 = v1.Value;
GetValueOrDefault
メソッドを使用すると、値がある場合は値が割り当てられ、それ以外の場合は型のデフォルト値、または指定したデフォルト値が割り当てられます。
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
HasValue
プロパティを使用して、v1
に値があるかどうかを確認できます。
if (v1.HasValue) {
v2 = v1.Value;
}
GetValueOrDefault(T)
メソッドに対する言語サポートもあります。
v2 = v1 ?? -1;
V1がnullの場合はできませんが、演算子で確認できます。
v2 = v1 ?? 0;
GetValueOrDefault()
オブジェクトの値を取得します。 nullの場合は、デフォルト値のint(0)が返されます。
例:
v2= v1.GetValueOrDefault();
Int型からint型への変換は次のように行えます。
v2=(int)v1;
v2 = Convert.ToInt32(v1);
で可能です
私が懸念している限りでは、最善の解決策はGetValueOrDefault()
メソッドを使うことです。
v2 = v1.GetValueOrDefault();
v1
はv2
よりも大きな値のドメインを持つため、v1
とv2
の間の単純な変換は不可能です。 v1
が保持できるすべてのものに加えてnull
状態があります。変換するためには、int
のどの値がnull
状態をマッピングするのに使用されるかを明示的に述べる必要があります。これを行う最も簡単な方法は??
演算子です。
v2 = v1 ?? 0; // maps null of v1 to 0
これは長い形式でも行うことができます
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
あなたはできる
v2 = v1.HasValue ? v1.Value : v2;
与えられた型のデフォルト値が受け入れられる結果であるならば:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
結果が未定義のときに別のデフォルト値が必要な場合は、
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
値を返したいだけの場合(メソッドが失敗したかどうかに関係なく):
v2 = v1.GetValueOrDefault();
。NET 4.7.2 .: GetValueOrDefault()
はチェックを行わずにフィールド値を返します。
使用状況に応じて、C#7のパターンマッチング機能を使うことができます。
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
何人かの人々が説明を残さずに投票しているので、これを実行可能な解決策として含めることの理論的根拠を説明するためにいくつかの詳細を加えたいと思います。
C#7のパターンマッチング では、値の型をチェックして暗黙的にキャストできます。上記のスニペットでは、v1
に格納されている値がv2
の型(この場合はint
)と型互換性がある場合にのみif-conditionが渡されます。 v1
の値がnull
の場合、nullをint
に代入できないため、if条件は失敗します。より正確には、null
はint
ではありません。
私はこの解決策が常に最適な選択ではないかもしれないということを強調したいと思います。私が示唆するように、私はこれが開発者の正確な使用状況に依存するだろうと思います。すでにint?
を持っていて、その値を条件付きで操作したい場合 if-and-only-if が割り当てられた値がnullではない場合intを使用すると、パターンマッチングがおそらく最も簡潔な方法の1つになります。
Nullでない場合はv1
の値をv2
に割り当てます。それ以外の場合はデフォルト値のゼロを取ります。
v2=v1??0
あるいは、以下がそれを書くための他の方法です。
v2 = v1.HasValue?v1:0