[英]Force C# Cast To Generic
我正在修改一個工具,因為我希望能夠使用泛型類型。 它有“AsDouble”,“AsBool”等屬性。
我想強制一個類型轉換,我不在乎它是否在運行時拋出。 我只想要它編譯。
所以...這不編譯......
public T As<T>()
{
Type type = typeof(T);
if (type == typeof(Double))
{
return (T)(AsDouble);
}
// more conditionals
}
但這確實......
public T As<T>()
{
Type type = typeof(T);
if (type == typeof(Double))
{
return (T)(AsDouble as object);
}
// more conditionals
}
為什么會這樣? 我如何讓它停止抱怨,並按我的要求去做? 還是有比我想象的更好的方法嗎?
//不重復建議的那個。 (Type1)Type2不起作用......我想知道為什么從T1轉換到T2到T3工作但不是T1到T3。 (T1為雙,T2為對象,T3為通用類型。)請在將其標記為重復之前閱讀我的問題。
如果T
沒有任何類型約束,編譯器將不知道要執行什么類型的轉換,因為T
和double
之間的關系未知。 我知道實現你想要的唯一方法是轉換對象,這可能會生成一個box / unbox操作(它可能會得到優化,但我不確定)。
對於具有明確特征的通用方法,我使用了以下模式:
class Owner
{
class AsHelper<T>
{
public static Func<Owner, T> As;
}
static Owner()
{
AsHelper<double>.As = _ => _.AsDouble;
// Other implementations
}
public T As<T>() where T: struct
{
if(AsHelper<T>.As != null)
{
return AsHelper<T>.As(this);
}
else
{
// Default implementation or exception
return default(T);
}
}
}
這使專業化保持在他們自己的方法中。 從我的性能測試來看,它與if基本方法大致相同。 由於靜態是.NET中的泛型類實例化,而不是每個泛型類定義, As
AsHelper<T>
的As
字段對於每個T
都有不同的值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.