为什么我会收到错误“类型'字符串'必须是非可空值类型才能在泛型类型或方法'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; }
}
}
}
答案 0 :(得分:196)
在代码的所有位置使用string
代替string?
。
Nullable<T>
类型要求T是不可为空的值类型,例如int
或DateTime
。像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#语法糖与不可为空的值类型,例如int
和Guid
。
特别是,由于string
是引用类型,类型string
的表达式可能已为空:
string lookMaNoText = null;
答案 2 :(得分:14)
System.String已经可以为空了:你不需要声明它(string?myStr)是错误的。
答案 3 :(得分:4)
出于非常具体的原因,类型Nullable<int>
将光标放在Nullable上并点击F12 - 元数据提供了原因(注意结构约束):
public struct Nullable<T> where T : struct
{
...
}
答案 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将导致编译器警告。