簡體   English   中英

c#泛型 <T> /約束問題

[英]c# Generics<T> / constraints question

考慮以下例程,它通過構建一些默認行為來簡化我的生活(例如,沒有空值,不解析“1,1,1”作為有效數字):

public static Double CvtToDouble(Object O) 
  { 
    if (O == null) return (Double)0; 
    if (O == System.DBNull) return (Double)0; 
    if (O is string) return Double.Parse((String)O, 
                                     System.Globalization.NumberStyles.Float); 
    return (T)O;
}

然后對所有num類型重復該例程。 我想通過將它們全部組合起來來節省打字和拼寫錯誤

public static T CvtTo<T>(Object O) : where T : "is one of Int32, Int16 ..."

通常的“where T:struct”約束在這里是不夠的,因為“return(T)0”語句對任意值類型無效。 似乎應該有一些方法來泛化它而不向后彎曲,但我沒有看到它。 我錯過了什么?

你不能這樣做。

.NET中的泛型不是模板,它們只編譯一次,因此必須在編譯時合法,而不是在調用時。

由於沒有where T : number約束,或者沒有where T : op_add()約束,你只能用泛型來做這個,你需要重載或運行時檢查才能做到這一點。

您可以嘗試在哪里T:IConvertible並更改您的最后一行以返回Convert.ToDouble(O)? 我很確定所有的值類型都支持該接口。

您可能需要考慮為每個或列出的類型包含擴展方法的靜態類,以便為每個目標類型提供CvtToDouble()擴展方法;

static class CvtToDoubleExtension
{
    static double CvtToDouble(this int arg)
    {
        return (double)arg;
    }

    static double CvtToDouble(this string arg)
    {
        return double.Parse(arg);
    }

    // Etc....
}

它不像你想要的通用方法那樣整潔,但它只有1個類,然后是CvtToDouble方法,可用於所有你想要的類型。

string example = "3.1412";
double value = example.CvtToDouble();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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