类型“ string”必须是非空类型,以便在泛型类型或方法“ System”中将其用作参数 T。可空 < T >’

为什么我得到错误“类型‘ string’必须是一个非空值类型,以便在泛型类型或方法‘ System’中将其用作参数‘ 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; }
}
}
}
159176 次浏览

在代码的所有位置使用 string而不是 string?

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

另外,如果您使用 C # 3.0或更高版本,您可以使用 自动实现的属性简化您的代码:

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

string 是一个引用类型,一个类。您只能使用 Nullable<T>T? C # 语法糖与非空 价值类型,如 intGuid

特别是,由于 string是一个引用类型,因此 string类型的表达式可能已经为 null:

string lookMaNoText = null;

由于一个非常特殊的原因,键入 Nullable<int>将您的光标放在 Nullable 上并按 F12-元数据提供了原因(注意结构约束) :

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

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

System.String(大写 S)已经可以为空,不需要声明为空。

(string? myStr)错了。

请注意,在即将推出的 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 值赋给非 null 值将导致编译器警告。

更多信息