ASP.. NET MVC / c# -空合并操作符,类型
本文关键字:合并 操作符 类型 NET MVC ASP | 更新日期: 2023-09-27 18:18:19
我尝试在我的页面上创建分页。用户可以选择每页显示的条目数量,首选的大小将被保存为cookie。但是当我尝试在querystring参数和cookie之间进行选择时,发生了一个错误:
public ActionResult Index(string keyword, int? page, int? size)
{
keyword = keyword ?? "";
page = page ?? 1;
//Operator "??" cannot be applied to operands of type "int" and "int"
size = size ?? Convert.ToInt32(Request.Cookies.Get("StoriesPageSize").Value) ?? 10;
是什么导致这个错误?如何解决这个问题?
Convert.ToInt32
只返回int
,而不是int?
-因此表达式的类型:
size ?? Convert.ToInt32(...)
的类型为int
。不能使用非空值类型作为空合并操作符表达式的第一个操作数——它不可能为空,因此永远不能使用第二个操作数(在本例中为10)。
如果你试图尝试使用StoriesPageSize
cookie,但你不知道它是否存在,你可以使用:
public ActionResult Index(string keyword, int? page, int? size)
{
keyword = keyword ?? "";
page = page ?? 1;
size = size ?? GetSizeFromCookie() ?? 10;
}
private int? GetSizeFromCookie()
{
string cookieValue = Request.Cookies.Get("StoriesPageSize").Value;
if (cookieValue == null)
{
return null;
}
int size;
if (int.TryParse(cookieValue, CultureInfo.InvariantCulture, out size))
{
return size;
}
// Couldn't parse...
return null;
}
正如在注释中提到的,您可以编写一个扩展方法来使其更普遍可用:
public static int? GetInt32OrNull(this CookieCollection cookies, string name)
{
if (cookies == null)
{
throw ArgumentNullException("cookies");
}
if (name == null)
{
throw ArgumentNullException("name");
}
string cookieValue = cookies.Get(name).Value;
if (cookieValue == null)
{
return null;
}
int size;
if (int.TryParse(cookieValue, CultureInfo.InvariantCulture, out size))
{
return size;
}
// Couldn't parse...
return null;
}
请注意,我已经更改了代码以使用不变文化—在不变文化中传播cookie中的信息是有意义的,因为它实际上并不意味着用户可见或文化敏感。你应该确保保存 cookie也使用不变区域性。
无论如何,有了扩展方法(在静态非泛型顶级类中),您可以使用:size = size ?? Request.Cookies.GetInt32OrNull("StoriesPageSize") ?? 10;
问题是第一个操作(size ?? Convert.ToInt32(Request.Cookies.Get("StoriesPageSize").Value)
)的结果是int型。然后在这个整型和另一个整型之间使用空合并运算符,但是因为整型不能为空,所以它失败了。
如果左侧不能为空,则使用空合并操作符没有意义,因此编译器会给出错误。
关于如何修复它,你可以这样重写:
size = size ?? (Request.Cookies.Get("StoriesPageSize") != null ? Convert.ToInt32(Request.Cookies.Get("StoriesPageSize").Value) : 10);