2011-06-24 49 views
2

我試圖編譯下面的代碼:仿製出賦值內部try塊

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

回答

10

該方法沒有問題,但您需要在Exception發生,因爲你不會再拋出。這意味着你可以退出該方法(在ChangeType的例外之後)而不給它提供價值。

在這種情況下,也許:

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

感謝馬克,我想我還是有一些瞭解的try/catch :) - 該解決方案爲我工作! – rtpHarry