C#可为空的字符串错误


136
private string? typeOfContract
{
  get { return (string?)ViewState["typeOfContract"]; }
  set { ViewState["typeOfContract"] = value; }
}

稍后在代码中,我将这样使用它:

typeOfContract = Request.QueryString["type"];

在声明typeOfContract行的声明时出现以下错误:

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

有任何想法吗?基本上,我想确保在执行操作之前该"type"存在QueryString

Answers:


304

System.String是引用类型,已经是“可为空”。

Nullable <T>和?后缀用于值类型,例如Int32,Double,DateTime等。


13
需要注意的一件事:Nullable <T>本身就是一个值类型,但是“ struct”泛型类型约束仅包括非空值类型-因此您不能执行Nullable <Nullable <int >>。
乔恩·斯基特

在C#8.0中,引用类型可以标记为可为空。可以键入一个string?告诉世界,该字符串可能为null。参考:youtube.com/watch?
v = VdC0aoa7ung

39

您正在使其变得复杂。string已经可以为空。您无需使其可为空。取出?属性类型。


19

string不能为Nullable的参数,因为string不是值类型。字符串是引用类型。

string s = null; 

是一个非常有效的语句,不需要使其为可为空。

private string typeOfContract
    {
      get { return ViewState["typeOfContract"] as string; }
      set { ViewState["typeOfContract"] = value; }
    }

应该因为as关键字而工作。


13

字符串是引用类型,因此您不需要(也不能)Nullable<T>在这里使用。只需将typeOfContract声明为字符串,然后从查询字符串中获取null即可检查是否为null。如果要处理与null相同的空字符串值,请使用String.IsNullOrEmpty。


4

对于可为空,请?与所有C#原语一起使用,但字符串除外。

下一页提供了C#原语的列表:http : //msdn.microsoft.com/zh-cn/library/aa711900( v = vs.71).aspx


1
链接已断开,谢谢
Mina Gabriel 2014年

谢谢Mina,我找到了另一个链接并更新了参考。
James Oravec 2014年

1
不仅是原始类型,所有非空值类型(.NET都没有专门处理)都可以工作。
IllidanS4希望莫妮卡回到2014年

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将导致编译器警告。

更多信息

对于要删除所有答案的主持人,请不要这样做。我坚信此答案会增加价值,而删除则只会使某人不知道当时什么是对的。由于您已删除所有答案,因此我在此处重新发布答案。发送的有关“重复项”的链接只是某些人的开场白,我认为这不是官方建议。

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.