为了在通用类型或方法“ System.Nullable <T>”中将其用作参数T,类型“ string”必须为非空类型


172

为什么会出现错误“类型'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; }
      }
    }
}

21
String已经可以为空。
M.Babcock

Answers:


204

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

1
M.Babcock,当我执行m_Word = null时,它出错了,有什么建议吗?我希望能够将Word设置为null。
其他用户

1
@MiscellaneousUser:您收到什么错误消息?您可以发布您尝试编译的确切文件吗?仅看到一行代码就很难猜测出您的错误是什么。我的意思是可能您缺少分号了……但是也许您只是忘记了复制并粘贴了它……这只是猜测,直到您发布尝试编译的代码。
Mark Byers

感谢您的帮助,看到这篇文章stackoverflow.com/questions/187406/…,可以看到问号仅适用于值类型。
MiscellaneousUser

@MiscellaneousUser:不仅是“针对值类型”。它必须特别是不可为空的值类型。就像错误消息说的那样。
Mark Byers

1
嘿,在对Swift进行了一段时间编程之后,这个人在C#项目中得到了我的最好评价。
艾伯特·博里

52

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

特别是,与string引用类型一样,type的表达式string可以已经为null:

string lookMaNoText = null;

15

System.String (使用大写S表示)已经可以为空,因此您无需这样声明。

(string? myStr) 是错的。


小修改您的答案,以突出显示大写字母的重要性。我是C#的新手,我花了很长时间才得到这个小小的区别。
B–rian

4

由于一个非常特定的原因,Type Nullable<int>将光标放在Nullable上并按F12键-Metadata提供了原因(请注意结构约束):

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

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


4
请注意,Nullable<Nullable<int>>即使Nullable<int>是结构也不允许这样做。
Mark Byers

那很有意思。是“硬编码”到编译器中吗?它如何受特定结构(Nullable <Nullable <... >>)的约束?-编辑,我现在显然很特别-编译错误...必须是非空值类型....
约书亚·恩菲尔德

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值分配给non-nullable将导致编译器警告。

更多信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.