C#可空字符串错误

时间:2008-10-09 14:03:58

标签: c# nullable

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

稍后在代码中我使用它:

typeOfContract = Request.QueryString["type"];

我在typeOfContract行声明:

的声明中收到以下错误
  

“string”类型必须是不可为空的值类型才能使用   它作为泛型类型或方法中的参数'T'   'System.Nullable< T>'

有什么想法吗?基本上,我希望在执行操作之前确保"type"中存在QueryString

6 个答案:

答案 0 :(得分:304)

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

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

答案 1 :(得分:39)

你让它变得复杂。 string已经可以为空了。您不需要使其更多可以为空。取出属性类型的?

答案 2 :(得分:19)

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

string s = null; 

是一个非常有效的陈述,不需要让它可以为空。

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

应该可以使用 as 关键字。

答案 3 :(得分:13)

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

答案 4 :(得分:4)

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

以下页面列出了 C#基元http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx

答案 5 :(得分: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将导致编译器警告。

More info

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