private string? typeOfContract
{
get { return (string?)ViewState["typeOfContract"]; }
set { ViewState["typeOfContract"] = value; }
}
稍后在代码中我使用它:
typeOfContract = Request.QueryString["type"];
我在typeOfContract
行声明:
“string”类型必须是不可为空的值类型才能使用 它作为泛型类型或方法中的参数'T' 'System.Nullable< T>'
有什么想法吗?基本上,我希望在执行操作之前确保"type"
中存在QueryString
。
答案 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将导致编译器警告。
对于要删除所有答案的主持人,请勿这样做。我坚信这个答案会增加价值,而删除则只会使某人不知道当时什么是对的。由于您已删除所有答案,因此我将在此处重新发布答案。发送的有关“重复项”的链接只是某些人的开场白,我认为这不是官方建议。