C#nullable文字列エラー


136
private string? typeOfContract
{
  get { return (string?)ViewState["typeOfContract"]; }
  set { ViewState["typeOfContract"] = value; }
}

コードの後半では、次のように使用します。

typeOfContract = Request.QueryString["type"];

typeOfContract行の宣言で次のエラーが発生します:

型 'string'は、ジェネリック型またはメソッド 'System.Nullable <T>'でパラメーター 'T'として使用するために、null不可の値型である必要があります

何か案は?基本的に、私はアクションを実行する前に"type"存在することを確認したいと思いQueryStringます。

回答:


304

System.Stringは参照型であり、すでに「null可能」です。

Nullable <T>と?サフィックスは、Int32、Double、DateTimeなどの値タイプ用です。


13
注意すべき点の1つ:Nullable <T>はそれ自体が値型ですが、 "struct"ジェネリック型制約にはnull不可の値型のみが含まれるため、Nullable <Nullable <int >>は実行できません。
Jon Skeet、

C#8.0では、参照型はnull許容としてマークされる場合があります。string?この文字列がnullの可能性があることを世界に知らせるために入力することができます。参照:youtube.com/watch
v

39

あなたはそれを複雑にしています。stringはすでにヌル可能です。これ null可能にする必要はありません。?プロパティタイプのを取り出します。


19

stringは値タイプではないため、stringをNullableのパラメーターにすることはできません。文字列は参照型です。

string s = null; 

これは非常に有効なステートメントであり、null可能にする必要はありません。

private string typeOfContract
    {
      get { return ViewState["typeOfContract"] as string; }
      set { ViewState["typeOfContract"] = value; }
    }

asキーワードのために機能するはずです。


13

文字列は参照型なので、Nullable<T>ここで使用する必要はありません(使用できません)。typeOfContractを文字列として宣言し、クエリ文字列からnullを取得した後、nullをチェックするだけです。または、nullと同じ空の文字列値を処理する場合は、String.IsNullOrEmptyを使用します。


4

null可能の場合は、文字列を除く?すべてのC#プリミティブで使用します。

次のページに、C#プリミティブのリストを示します。http//msdn.microsoft.com/en-us/library/aa711900(v = vs.71).aspx


1
リンクが壊れたありがとう
ミナガブリエル14

ミナに感謝します。別のリンクを見つけ、リファレンスを更新しました。
James Oravec 2014

1
プリミティブだけでなく、すべてのnull可能ではない値タイプ(.NETで特別に処理されないもの)が機能します。
IllidanS4はモニカに2014

0

C#の次期バージョンである8では、答えが正しくないことに注意してください。

All the reference types are non-nullable by default 実際に次のことができます:

public string? MyNullableString; 
this.MyNullableString = null; //Valid

しかしながら、

public string MyNonNullableString; 
this.MyNonNullableString = null; //Not Valid and you'll receive compiler warning. 

ここで重要なことは、コードの意図を示すことです。 「意図」が参照型がnullである可能性がある場合は、それをマークします。そうでない場合は、null値にnull値を割り当てるとコンパイラ警告が発生します。

より詳しい情報

すべての回答を削除するモデレーターには、行わないでください。私はこの答えが価値を追加し、削除することが誰かがその時何が正しいかを知らないようにするだけだと強く信じています。すべての回答を削除したので、ここに回答を再投稿しています。「重複」に関して送信されたリンクは、単に一部の人々のオープニングであり、私はそれが公式の推奨ではないと思います。

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