回答:
これまでの他の答えはすべて正しいです。もう少しクリーンなものを追加したかっただけです。
v2 = v1 ?? default(int);
Any 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セーフゲッターであるため、これも機能します。
v2 = v1.GetValueOrDefault();
default(int)
本当に必要?シンプルの何が問題になってい0
ますか?
default
は適切な場所で使用することをお勧めします。ゼロは値として常に有効であるとは限らず、デフォルトよりはるかに低いためint
、ジェネリックに置き換えると、T
私のコードは機能しますが、ゼロは機能しません。一部の将来のフレームワークバージョンでdefault
は、オーバーロード可能になる可能性もあります。その場合、デフォルトを使用するコードは簡単に利用できますが、明示的なnullまたはゼロの割り当ては変更する必要があります。
このような、
if(v1.HasValue)
v2=v1.Value
Valueプロパティを割り当てに使用できます。
v2 = v1.Value;
v1.HasValue
最初に確認してください。
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();
特定のタイプのデフォルト値が許容可能な結果である場合:
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()
チェックなしでフィールド値を返します。
私に関する限り、最善の解決策はGetValueOrDefault()
メソッドを使用することです。
v2 = v1.GetValueOrDefault();
null可能からintへの変換は、次のように行うことができます。
v2=(int)v1;
それは可能です v2 = Convert.ToInt32(v1);
使用状況に応じて、C#7のパターンマッチング機能を使用できます。
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
一部の人々は説明を残さずに反対票を投じているので、これを実行可能な解決策として含めるための根拠を説明するためにいくつかの詳細を追加したいと思います。
C#7のパターンマッチングにより、値のタイプをチェックして暗黙的にキャストできるようになりました。上記のスニペットでは、if-conditionは、に格納されている値v1
がの型と互換性がある場合にのみ渡されます。v2
この場合はint
です。の値がときということにv1
あるnull
ヌルを割り当てることができないので、もし条件が失敗しますint
。より適切にnull
は、ではありませんint
。
このソリューションが常に最適な選択であるとは限らない可能性があることを強調したいと思います。私が提案するように、これは開発者の正確な使用状況に依存すると信じています。すでにがあり、割り当てられた値がnullでない場合にのみint?
その値を条件付きで操作したい場合(これは、情報を失うことなくnull可能intを通常のintに安全に変換できる唯一の場合です)、パターンマッチングは、おそらくこれを行う最も簡潔な方法の1つです。
HasValue
チェックをリファクタリングするリスクがないため、デフォルト値がない場合はこれが最良の(最も安全な)ソリューションです。
C#7.1以降では、演算子の代わりにdefault
リテラルを使用して型を推測できるため、次のように記述できます。default
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1
はnull
何ですか?