为什么我会收到错误“类型'string'必须是不可为空的值类型才能将其用作泛型类型或方法'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; }
}
}
}
String
已经可以为空。
在代码中的所有位置都使用 string
而不是 string?
。
Nullable<T>
类型要求 T 是不可为空的值类型,例如 int
或 DateTime
。 string
之类的引用类型已经可以为空。允许像 Nullable<string>
这样的东西是没有意义的,所以它是不允许的。
此外,如果您使用 C# 3.0 或更高版本,您可以使用 auto-implemented properties 简化代码:
public class WordAndMeaning
{
public string Word { get; set; }
public string Meaning { get; set; }
}
string
是一个引用类型,一个类。您只能将 Nullable<T>
或 T?
C# 语法糖与不可为空的 value 类型(例如 int
和 Guid
)一起使用。
特别是,由于 string
是引用类型,因此 string
类型的表达式可能已经为 null:
string lookMaNoText = null;
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 将导致编译器警告。
出于一个非常具体的原因,键入 Nullable<int>
将光标放在 Nullable 上并按 F12 - 元数据提供了原因(注意结构约束):
public struct Nullable<T> where T : struct
{
...
}
http://msdn.microsoft.com/en-us/library/d5x73970.aspx
Nullable<int>
是一个结构,但不允许使用 Nullable<Nullable<int>>
。