web-dev-qa-db-ja.com

型の後の疑問符の目的は何ですか(例:int?myVariable)。

通常、疑問符の主な用途は条件付きx ? "yes" : "no"です。

しかし、私は別の用途を見ましたが、たとえば?演算子のこの用途の説明を見つけることができません。

public int? myProperty
{
   get;
   set;
}
396
GenEric35

つまり、問題の値の型は null許容型 です。

Null許容型はSystem.Nullable構造体のインスタンスです。 NULL可能型は、その基礎となる値型に対する正しい値の範囲と、追加のNULL値を表すことができます。たとえば、 "Nullable of Int32"と発音されるNullable<Int32>には、-2147483648から2147483647までの任意の値を代入できます。または、null値を代入できます。 Nullable<bool>には、true、false、またはnullの値を割り当てることができます。数値やブール型にnullを代入する機能は、データベースや、値を代入できない要素を含む他のデータ型を扱う場合に特に役立ちます。たとえば、データベース内のブール型フィールドには、trueまたはfalseの値を格納できます。あるいは、未定義の場合もあります。

class NullableExample
{
  static void Main()
  {
      int? num = null;

      // Is the HasValue property true?
      if (num.HasValue)
      {
          System.Console.WriteLine("num = " + num.Value);
      }
      else
      {
          System.Console.WriteLine("num = Null");
      }

      // y is set to zero
      int y = num.GetValueOrDefault();

      // num.Value throws an InvalidOperationException if num.HasValue is false
      try
      {
          y = num.Value;
      }
      catch (System.InvalidOperationException e)
      {
          System.Console.WriteLine(e.Message);
      }
  }
}
400
Sean

Nullable<int> の省略形です。 Nullable<T>は、値型をnullに設定できるようにするために使用されます。値型は通常 nullにすることはできません

110

x ? "yes" : "no"

は、if文を宣言します。ここで、xはブール条件を表します。 の前の部分はthenの文で、後の部分はelseの文です。

例えば、

int?

はnull許容型を宣言し、それより前の型はnull値を持つことができることを意味します。

56
eKek0

null許容型

Null許容型はSystem.Nullable構造体のインスタンスです。 NULL可能型は、その基礎となる値型の通常の値の範囲と、追加のNULL値を表すことができます。たとえば、 "Nullable of Int32"と発音された[Nullable<Int32>]には、-2147483648から2147483647までの任意の値を代入することも、null値を代入することもできます。 [Nullable<bool>]には、値trueまたはfalse、またはnullを割り当てることができます。数値やブール型にnullを代入する機能は、データベースや、値を代入できない要素を含む他のデータ型を扱う場合に特に役立ちます。たとえば、データベース内のブール型フィールドには、trueまたはfalseの値を格納できます。あるいは、未定義の場合もあります。

47
Ahmet Kakıcı

型がNULL可能であることを宣言します。

11

実用的な使い方

public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
  if (value == null)
  {
    return "bad value";
  }

  return someFunctionThatHandlesIntAndReturnsString(value);
}
6
A.J.Bauer

上記の回答に追加するために、これがコードサンプルです。

struct Test
{
    int something;
}
struct NullableTest
{
    int something;
}
class Example
{
    public void Demo()
    {
        Test t = new Test();
        t = null;

        NullableTest? t2 = new NullableTest();
        t2 = null;
    }
}

これによりコンパイルエラーが発生します。

エラー12 nullが許容されない値型であるため、nullを 'Test'に変換できません

NullableTestにはコンパイルエラーがないことに注意してください。 (t2の宣言の中の?に注意してください)

3

int?Nullable<int>の省略形です。2つの形式は交換可能です。

Nullable<T>は、値型Tと一緒に使用してnullを受け入れることができる演算子です。

あなたがそれを知らない場合: 値型intboolcharなどとして値を受け取る型です...

値への参照を受け入れることはできません。 参照型 ではなく、それらにnullを割り当てるとコンパイル時エラーが発生します。明らかにそれを受け入れます。

なぜあなたはそれが必要でしょうか?データベースから返された変数が見つからないか未定義の場合のように、値型変数が、うまく動作しないものから返されたnull参照を受け取ることがあるためです。

Microsoftのドキュメント を読むとよいでしょう。

2
Nicola Amadio