[英]C# generics and casting
我在代碼庫中遇到了一個拋出錯誤的函數:
public static T InternalData<T>()
{
return (T)"100";
}
顯然我已經簡化了代碼並添加了“100”作為文字字符串值。 T的類型為int
。
它拋出一個:
System.InvalidCastException:指定的強制轉換無效。
看來你不能在C#中隱式地將字符串轉換為int
,如何修復這段代碼以便它可以處理轉換任何泛型類型?
實際代碼看起來像這樣:
public static T InternalData<T>()
{
return (T) something (not sure of type or data);
}
嘗試:
public static T InternalData<T>(object data)
{
return (T) Convert.ChangeType(data, typeof(T));
}
這適用於實現IConvertible
接口的類型( Int32
和String
)。
一種可能性是使用
return (T)Convert.ChangeType(yourValue, typeof(T));
請注意,如果yourValue
不是實現IConvertible
的類型的實例,則會拋出異常。 如果值本身無法轉換,它也會拋出異常,例如,如果你有“abc”而不是“100”。
使用Convert.ChangeType
。
public static T InternalData<T>()
{
return (T)Convert.ChangeType("100", typeof (T));
}
如果值無法轉換,它仍會拋出錯誤,但它不會嘗試直接轉換。 它可以將字符串轉換為int。
不要混淆鑄造和轉換! 如果編譯器不知道表達式的真實類型,例如因為它被鍵入為object
,並且您知道它的固有類型,那么您可以告訴C#編譯器,“嘿,我知道它是一個int
,所以請將其視為一個int
“。
(int)expression
在你的情況下,表達式是一個字符串表達式,不能轉換為int
,只是beacuase它不是一個int
。 但是,如果它表示有效整數,則可以將字符串轉換為int
。 此外,轉換的結果類型未知,因為它是通用的。 像其他人已經建議的那樣使用(T)Convert.ChangeType(...)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.