Convert.ToInt32
だけint
、ないint?
返します - ので、表現の種類:
size ?? Convert.ToInt32(...)
はタイプ
int
です。ヌル合体演算子式の最初のオペランドとしてヌル値を持たない値型を使用することはできません。ヌルにすることはできません。したがって、2番目のオペランド(この場合は10)は決して使用できません。
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;
}
をコメントで述べたように、あなたが書くことができる:あなたが使用することができ、
あなたはしようとしている場合は、StoriesPageSize
クッキーを使用するようにをしようとしますが、それは存在だかどうかわかりませんこれは、より一般的に利用できるようにする拡張メソッド:私は、インバリアントカルチャを使用するコードを変更した
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;
}
注 - それは不変の文化の中で、クッキーの情報を伝播することは理にかなって、それは本当にありませんとしてユーザーが目に見えるものや文化に敏感なものを意味します。 も、不変のカルチャを使用してクッキーを保存するようにしてください。とにかく
、(静的な非ジェネリックトップレベルのクラスで)代わりに拡張メソッドで、あなたが使用することができます。
size = size ?? Request.Cookies.GetInt32OrNull("StoriesPageSize") ?? 10;
関連:http://stackoverflow.com/questions/7729024/asp-net-mvc-razor-ternary –