型 'string'は、ジェネリック型またはメソッド 'System.Nullable <T>'のパラメーターTとして使用するために、null不可の型でなければなりません


172

エラー「ジェネリック型またはメソッド 'System.Nullable'のパラメーター 'T'として使用するには、型 'string'はnullにできない値型でなければならない」が発生するのはなぜですか?

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Universe;

namespace Universe
{
    public class clsdictionary
    {
      private string? m_Word = "";
      private string? m_Meaning = "";

      string? Word { 
          get { return m_Word; }
          set { m_Word = value; }
      }

      string? Meaning { 
          get { return m_Meaning; }
          set { m_Meaning = value; }
      }
    }
}

21
Stringはすでにヌル可能です。
M.バブコック

回答:


204

コードのすべての場所ではstringなくを使用string?してください。

このNullable<T>型では、Tがnullを許容しない値の型であるint必要がありDateTimeます(例:または)。のような参照型stringはすでにnullにすることができます。そのようなNullable<string>ことを許可しても意味がないので、許可されません。

また、C#3.0以降を使用している場合は、自動実装プロパティを使用してコードを簡略化できます

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}

1
M.バブコック、m_Word = nullを実行すると、エラーが発生しますか?Wordをnullに設定できるようにしたい。
MiscellaneousUser

1
@MiscellaneousUser:どのエラーメッセージが表示されますか?コンパイルしようとした正確なファイルを投稿できますか?コードが1行しか表示されないのは、あなたの間違いが何であるかを推測するのは難しいことです。つまり、セミコロンが欠落している可能性があります...たぶんそれをコピーして貼り付けるのを忘れたのかもしれません...コンパイルしようとしたコードを投稿するまで、それは当て推量に過ぎません。
マーク・バイアーズ

助けてくれてありがとう、この投稿stackoverflow.com/questions/187406/…を見て、疑問符は値の種類のみのものであることがわかります。
MiscellaneousUser

@MiscellaneousUser:「値型用」だけではありません。具体的には、nullを許容しない値の型である必要があります。エラーメッセージが言うように。
マークバイアーズ

1
ええと、しばらくSwiftをプログラミングした後、これはC#プロジェクトで最高のものを得ました。
Albert Bori 2015年

52

string参照型、クラスです。Nullable<T>またはT?C#構文シュガーは、およびなどのnull不可のタイプでのみ使用できます。intGuid

特に、string参照型と同様に、型の式stringはすでにnullである可能性があります。

string lookMaNoText = null;

15

System.String (大文字のSを使用)は既にnullを指定できます。そのように宣言する必要はありません。

(string? myStr) 間違っている。


大文字の重要性を強調するために、回答を少し編集してください。私はC#を初めて使用するので、この小さな違いを得るのに永遠にかかりました。
B--rian

4

非常に具体的な理由で、タイプでNullable<int>カーソルをNullableに置き、F12を押します-メタデータが理由を提供します(構造制約に注意してください)。

public struct Nullable<T> where T : struct
{
...
}

http://msdn.microsoft.com/en-us/library/d5x73970.aspx


4
ただし、構造体でNullable<Nullable<int>>あっても許可されていませんNullable<int>
マーク・バイアーズ

それは面白い。それはコンパイラに「ハードコード」されていますか?特定の構造体(Nullable <Nullable <... >>)からどのように制約されますか?- .... null非許容値型でなければなりません...コンパイルエラーが発生しました-編集私は今、どうやらそれは特別で見る
ジョシュア・エンフィールド

4

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.