簡體   English   中英

C#泛型和鑄造

[英]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接口的類型( Int32String )。

一種可能性是使用

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM