try块内的泛型out值赋值

本文关键字:out 赋值 泛型 try | 更新日期: 2023-09-27 18:00:23

我正在尝试编译以下代码:

public static void RequireOrPermanentRedirect<T>(this System.Web.UI.Page page, string QueryStringKey, string RedirectUrl, out T parsedValue)
{
    string QueryStringValue = page.Request.QueryString[QueryStringKey];
    if (String.IsNullOrEmpty(QueryStringValue))
    {
        page.Response.RedirectPermanent(page.ResolveUrl(RedirectUrl));
    }
    try
    {
        parsedValue = (T)Convert.ChangeType(QueryStringValue, typeof(T));
    }
    catch
    {
        page.Response.RedirectPermanent(RedirectUrl);
    }
}

但我得到了一个编译器错误:

Error   1   The out parameter 'parsedValue' must be assigned to before control leaves the current method

这是一种扩展方法,我已经使用了一段时间,但我想对它进行一点扩展,这样我就不必重新分析值来在页面中使用它。

当前用途:

Page.RequireOrPermanentRedirect<Int32>("TeamId", "Default.aspx");
int teamId = Int32.Parse(Request.QueryString["TeamId"]);

我想做的事:

private Int32 teamId;
protected void Page_Load(object sender, EventArgs e)
{
    Page.RequireOrPermanentRedirect<Int32>("TeamId", "Default.aspx", out teamId);
}

我刚刚创建的当前(正在工作)代码丢弃了一个T value:

try
{
    T value = (T)Convert.ChangeType(QueryStringValue, typeof(T));
}

try块内的泛型out值赋值

该方法很好,但在发生Exception的情况下需要做一些事情,因为您不会重新抛出。这意味着您可以退出该方法(在ChangeType中出现异常之后),而不给它一个值。

在这种情况下,可能:

catch
{
    parsedValue = default(T);
    page.Response.RedirectPermanent(RedirectUrl);        
}