web-dev-qa-db-ja.com

C#null許容のintをintに変換する方法

NULL可能なintintに変換する方法以下のように2種類のintがあるとします。

int? v1;  
int v2; 

v1の値をv2に代入したいです。 v2 = v1;はエラーを引き起こします。 v1v2に変換するにはどうすればいいですか?

413
KentZhou

他の答えはこれまでのところすべて正しいです。もう少しクリーンなものをもう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();
564
KeithS

このような、

if(v1.HasValue)
   v2=v1.Value

代入にはValueプロパティを使用できます。

v2 = v1.Value;
80
e36M3

あなたが必要なのは..

v2= v1.GetValueOrDefault();
70
thestar

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;
45
Guffa

V1がnullの場合はできませんが、演算子で確認できます。

v2 = v1 ?? 0;
42
Arturo Martinez

GetValueOrDefault()

オブジェクトの値を取得します。 nullの場合は、デフォルト値のint(0)が返されます。

例:

v2= v1.GetValueOrDefault();

27
Aniket Sharma

Int型からint型への変換は次のように行えます。

v2=(int)v1;
11

v2 = Convert.ToInt32(v1);で可能です

11
Rev

私が懸念している限りでは、最善の解決策はGetValueOrDefault()メソッドを使うことです。

v2 = v1.GetValueOrDefault();
10

v1v2よりも大きな値のドメインを持つため、v1v2の間の単純な変換は不可能です。 v1が保持できるすべてのものに加えてnull状態があります。変換するためには、intのどの値がnull状態をマッピングするのに使用されるかを明示的に述べる必要があります。これを行う最も簡単な方法は??演算子です。

v2 = v1 ?? 0;  // maps null of v1 to 0

これは長い形式でも行うことができます

int v2;
if (v1.HasValue) {
  v2 = v1.Value;
} else {
  v2 = 0;
}
9
JaredPar

あなたはできる

v2 = v1.HasValue ? v1.Value : v2;
9
FIre Panda

与えられた型のデフォルト値が受け入れられる結果であるならば:

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() はチェックを行わずにフィールド値を返します。

8
GrzegorzF

使用状況に応じて、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条件は失敗します。より正確には、nullintではありません。

  • 私はこの解決策が常に最適な選択ではないかもしれないということを強調したいと思います。私が示唆するように、私はこれが開発者の正確な使用状況に依存するだろうと思います。すでにint?を持っていて、その値を条件付きで操作したい場合 if-and-only-if が割り当てられた値がnullではない場合intを使用すると、パターンマッチングがおそらく最も簡潔な方法の1つになります。

3
Nick Miller

Nullでない場合はv1の値をv2に割り当てます。それ以外の場合はデフォルト値のゼロを取ります。

v2=v1??0

あるいは、以下がそれを書くための他の方法です。

v2 = v1.HasValue?v1:0
2
sagar