簡體   English   中英

強制C#轉換為通用

[英]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沒有任何類型約束,編譯器將不知道要執行什么類型的轉換,因為Tdouble之間的關系未知。 我知道實現你想要的唯一方法是轉換對象,這可能會生成一個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.

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