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


433

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

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

public int? myProperty
{
   get;
   set;
}

回答:


436

これは、問題の値の型がnull許容型であることを意味します

Nullable型はSystem.Nullable構造体のインスタンスです。null許容型は、基になる値型の正しい範囲の値と、追加のnull値を表すことができます。たとえば、Nullable<Int32>「Nullable of Int32」と発音されるには 、-2147483648〜2147483647の任意の値を割り当てることができます。または、null値を割り当てることができます。Aに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);
      }
  }
}

3
構造体に使用されます。実際にはクラスに役立つとは思わないでください。
MonsieurDart 2015

8
@MonsieurDart-それが答えが「値の型」と言う理由
Sean

3
@AntoineDahan-値型は、null可能ではないため、null可能型はありません。たとえば、int型と対応するIntegerクラスがあるJavaを考えていると思います。
Sean

2
nullable型の最新(2015)のドキュメントはこちら
恐竜


118

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


3
加えて、略記という用語を使用するための1つ、かなり簡単です。
ハリ

3
2番目の文は私を混乱させます。「できない」とはどういう意味ですか?コンパイラレベルまたはアプリケーションコンテキスト。
problemofficer 2017年

5
定義ごとの@problemofficerはvalue typesnull にできません。特に値を割り当てずにintまたはbool(値の型)を宣言した場合でも、値(それぞれ0とfalse)があります。それらはnullにはなりません。reference types一方、オブジェクトやMyClassなどのUnassigned はnullになります。値の型と参照の型の違いについて調べたい場合があります。
クラウスビスコフペデルセン2017

ご説明ありがとうございます。今、私は分かる。
problemofficer 2017

62

x ? "yes" : "no"

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

たとえば、

int?

null許容型を宣言し、その前の型がnull値を持つ可能性があることを意味します。


9
「?」の間に関係はありません null許容型と3項式を宣言します。回答を投票してください。
Gus Crawford

36
上記のガスからのコメントには同意しません。この質問は、3値式との混同の可能性があることを示しています。この回答はこの問題に対処します。
マリオレベスク

この種のnull比較はどこで使用しますか?返品中は許可されていないようです。boolに変換できreturn value ? value : "isNull";ないことを教えてくれstring valueます。
C4d

これは、特にこの質問について他の人と比較すると、非常に複雑な答えであると言わなければなりません。-1
FastTrack

これは受け入れられる答えになるはずです。それは明確で正確なので。+1
JP Dolocanog 2017

49

null許容型

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



6

実用的な使い方:

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

  return someFunctionThatHandlesIntAndReturnsString(value);
}

1
OPはまだアクティブですが、質問が行われてから5年後、回答は適切ではなくなる可能性があります。
イチゴ、

10
私にとってそれは3時間前
でした

3

上記の答えに追加するために、ここにコードサンプルがあります

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にできない値型であるため、nullを 'Test'に変換できません

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


2

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

Nullable<T>あなたが値型で使用できることをオペレータであるTことが受け入れ作るためにはnull

あなたはそれを知っていない場合:値の型は、などの値受け入れるタイプですintboolcharなどが...

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

なぜそれが必要なのですか?値型変数は、データベースから返された欠落した変数や未定義の変数など、うまく機能しないものから返されたnull参照を受け取ることがあるからです。

Microsoftのドキュメントは主題を十分にカバーしているので、読むことをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.