1

我正在尝试在我的页面上创建分页。用户可以选择每页显示的项目数,然后将首选大小保存为 cookie。但是当我尝试在查询字符串参数和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; 

是什么导致了这个错误?如何解决?

4

2 回答 2

6

Convert.ToInt32只返回int,而不是int?- 所以表达式的类型:

size ?? Convert.ToInt32(...)

是类型int。您不能将不可为空的值类型用作 null 合并运算符表达式的第一个操作数 - 它不可能为 null,因此永远不可能使用第二个操作数(在本例中为 10)。

如果您尝试使用StoriesPageSizecookie,但您不知道它是否存在,您可以使用:

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;
于 2011-12-19T07:59:38.930 回答
1

问题是第一个操作 ( size ?? Convert.ToInt32(Request.Cookies.Get("StoriesPageSize").Value)) 的结果是一个 int。然后在这个 int 和另一个 int 之间使用 Null Coalescing Operator,但是由于一个 int 不能为 null,所以它失败了。

如果左侧不能为 null,则使用 Null Coalescing Operator 没有任何意义,因此编译器会出错。

关于如何修复它,您可以像这样重写它:

size = size ?? (Request.Cookies.Get("StoriesPageSize") != null ? Convert.ToInt32(Request.Cookies.Get("StoriesPageSize").Value) : 10);
于 2011-12-19T08:00:50.540 回答