универсальное присваивание значения внутри блока try - PullRequest
2 голосов
/ 24 июня 2011

Я пытаюсь скомпилировать следующий код:

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"]);

То, что я хотел, чтобы иметь возможностьdo:

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));
}

1 Ответ

10 голосов
/ 24 июня 2011

Метод в порядке, но вам нужно что-то сделать в случае, если Exception произойдет, поскольку вы не перебрасываете.Это означает, что вы можете выйти из метода (после исключения в ChangeType), не задавая ему значение.

В этом случае может быть:

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