Convert.ToInt32
int
-ではなく、を返すだけint?
なので、式のタイプは次のようになります。
size ?? Convert.ToInt32(...)
タイプint
です。null合体演算子式の最初のオペランドとしてnull不可能な値型を使用することはできません。nullになることはできないため、2番目のオペランド(この場合は10)を使用することはできません。
Cookieを使おうとStoriesPageSize
しているが、それが存在するかどうかわからない場合は、次を使用できます。
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;