在一個聲明中鑄造我有一個小工具方法,看起來像這樣:拆箱和泛型方法
/// <summary>
/// Replaces a DBNull value with the default of the type specified
/// </summary>
/// <typeparam name="T">Resulting type</typeparam>
/// <param name="p_this">Object to check for DBNull</param>
/// <returns>p_this if it is not DBNull.Value, else default(T)</returns>
public static T ReplaceDBNullWithDefault<T>(this object p_this)
{
return p_this == System.DBNull.Value ? default(T) : (T)p_this;
}
在我的特定情況下,我拿着一個記錄了一個數據表,並採取特定領域使用弱類型,我得到的具體領域是一個long
這是被裝箱到object
。再現這樣的一個例子是如下:
var obj = 2934L;
int num = obj.ReplaceDBNullWithDefault<int>();
它失敗並InvalidCastException
,在(T)p_this
。
我明白爲什麼,盒裝long
不能直接轉換爲int
,並試圖像這樣做也失敗:
object myLong = 234L;
int myInt = (int)myLong;
然而,拆箱,然後澆注工作正常:
object myLong = 234L;
int myInt = (int)(long)myLong;
如何在我的方法中解決此問題?
難道你的理由闡述爲什麼你鑄造'int',而不是'long'? (因此將'T'指定爲'long') –
通過提供正確的類型;) –
我將結果放入的字段是「int」,而不是「long」。我想我可以在那裏演出。 – Logan