2010-10-29 130 views
4

我們正在升級我們的蹩​​腳的cms系統,並且新的程序集已從int更改爲int64。現在嘗試構建時遇到問題。我試過鑄造,但它似乎沒有幫助。這裏是導致問題的代碼摘錄。C#將int轉換爲Int64

IDictionary<int, string> aliases 
    = new UrlAliasApi().GetUrlAliasesByType(
     Company.DataLayer.Enumeration.UrlAliasType.Recipe); 
foreach (ContentBase recipe in mergedResultset) 
{ 
    // if alias exists, overwrite quicklink! 
    string alias; 
    if (aliases.TryGetValue(recipe.Id, out alias)) 
    { 
     recipe.QuickLink = alias; 
    } 
} 

該錯誤是

錯誤323的最好重載方法匹配 'System.Collections.Generic.IDictionary.TryGetValue(INT,出字符串)' 具有一些無效參數

它指的是recipe.Id這是一個Int64值。

任何想法來處理這個?

+2

你有一個名爲'Enumeration'的_namespace_? – SLaks 2010-10-29 19:54:16

回答

2

由於C#是強類型的,所以不能像這樣轉換。您需要將Int64的強制轉換爲Int32你在傳遞前:

aliases.TryGetValue((int)recipe.Id, out alias) 

或者,你可以改變你的字典的定義:

IDictionary<Int64, string> aliases 
    = new UrlAliasApi().GetUrlAliasesByType(Company.DataLayer.Enumeration.UrlAliasType.Recipe) 
         .ToDictionary(kvp => (Int64)key.Key, kvp => kvp.Value); 
+0

第一種解決方案不正確。它提供了一個溢出場景來計算不正確密鑰的可能性。 – JaredPar 2010-10-29 19:58:17

+0

我喜歡這個網站和偉大的人在這裏。對於初學.NET開發人員來說,這是一個非常棒謝謝你codekaizen。 – tking 2010-10-29 19:58:48

+0

@JaredPar - 同意,第二更安全。 – codekaizen 2010-10-29 19:59:34

1

您需要的Int64強制轉換爲int,像這樣:

aliases.TryGetValue((int)recipe.Id, out alias) 
+0

在溢出情況下,「Id」字段可以舍入到不同的有效值併產生誤報。 – JaredPar 2010-10-29 19:58:47

0

爲什麼你就不能使用Dictionary<Int64, string>代替Dictionary<int, string>

1

這裏的問題是,您正試圖在需要int/Int32類型的地方使用Int64值。這裏沒有隱式轉換,因此編譯器錯誤。

解決此問題的最佳方法是將aliases字典轉換爲使用Int64類型。將int轉換爲Int64總是安全的,因此在此轉換中不會丟失信息。

理想情況下,您可以將GetUrlAliasesByType轉換爲返回IDictionary<Int64,string>。系統的其餘部分現在使用Int64,所以這種轉換很有意義。否則,你可以做以下

string alias; 
try { 
    if (aliases.TryGetValue(checked((int)recipe.Id), out alias)) 
    { 
    recipe.QuickLink = alias; 
    } 
} catch (OverflowException) { 
    // id not valid 
} 

選中的操作在這裏是必要的,因爲它可以防止無聲溢出生產具有TryGetValue

1

注意錯誤匹配,雖然你可以投的Int64來的Int32(或INT),如果您正在投射的值大於可以在Int32中表示的值,則可能會丟失一些數據。在你的情況下,這可能並不重要,但我想我應該提及它。