web-dev-qa-db-ja.com

C#null許容文字列エラー

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に存在することを確認します。

136
Mike Fielden

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

Nullable <T>および?接尾辞は、Int32、Double、DateTimeなどの値タイプ用です。

304
Joe

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

39
jop

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

string s = null; 

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

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

asキーワードにより動作するはずです。

19
Szymon Rozga

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

13
csgero

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

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

4
James Oravec

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

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になる可能性がある場合は、マークします。警告。

詳細

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

0
ANewGuyInTown