类型'string'必须是非可空类型,才能在泛型类型或方法'System.Nullable <t>'中使用它作为参数T </t>

时间:2012-02-10 23:51:46

标签: c# nullable

为什么我会收到错误“类型'字符串'必须是非可空值类型才能在泛型类型或方法'System.Nullable'中将它用作参数'T'?”

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; }
      }
    }
}

5 个答案:

答案 0 :(得分:196)

在代码的所有位置使用string代替string?

Nullable<T>类型要求T是不可为空的值类型,例如intDateTime。像string这样的引用类型已经可以为null。允许像Nullable<string>这样的东西没有意义,所以不允许这样做。

此外,如果您使用的是C#3.0或更高版本,则可以使用auto-implemented properties简化代码:

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

答案 1 :(得分:51)

string是一个引用类型,一个类。您只能使用Nullable<T>T? C#语法糖与不可为空的类型,例如intGuid

特别是,由于string是引用类型,类型string的表达式可能已为空:

string lookMaNoText = null;

答案 2 :(得分:14)

System.String已经可以为空了:你不需要声明它(string?myStr)是错误的。

答案 3 :(得分:4)

出于非常具体的原因,类型Nullable<int>将光标放在Nullable上并点击F12 - 元数据提供了原因(注意结构约束):

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

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

答案 4 :(得分: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值分配给non-nullable将导致编译器警告。

More info