簡體   English   中英

T型默認值

[英]T type default value

我有幾種擴展方法,例如ParseIntParseLongParseByte 現在,我正在嘗試為所有這些方法制作一個擴展方法。 問題是要使Default參數成為可選參數,我必須給它一個像T Default = 0這樣的值,但它會產生錯誤:

類型'int'的值不能用作默認參數,因為沒有標准轉換為'T'類型

如果我像T Default = (T)0這樣使用它,則會收到另一個錯誤:

無法將類型“ int”轉換為“ T”

這是我的擴展方法:

public static T Parse<T>(this string x, T Default = 0)
        {
            Type type = typeof(T);
            if(type == typeof(int))
            { if(!string.IsNullOrEmpty(x) int.TryParse(x , out Defualt); return Default;  }
        }

您可以只使用default(T)代替:

public static T Parse<T>(this string x, T defaultValue = default(T))

但是,我會在這里強烈質疑設計-您實際上並不是在編寫通用方法,而是一種接受一組特定類型之一並以不同方式對待每個類型的方法。 有時您會強制執行此操作,但是我通常會使用Dictionary<T, SomeDelegate>嘗試更干凈地處理它。

另外,調用int.TryParse仍然會遇到問題-您不能將Parse<T>的參數用作參數-您需要類似以下內容:

if (typeof(T) == typeof(int))
{
    // You need to consider what you want to happen if
    // int.TryParse returns false - do you want to return 0,
    // or defaultValue?
    int ret;
    if (int.TryParse(x, out ret))
    {
        // Annoying but required due to which conversions are available
        return (T)(object) ret;
    }
}
return defaultValue;

就像已經提到的另一個答案一樣,您可以通過使用default關鍵字default(T)來獲取泛型類型的默認值作為編譯時常量。

  • 如果T是類或接口類型,則default(T)是空引用。
  • 如果T是一個結構,則default(T)是所有位均為零的值。 對於數字類型,此值為0 ;對於boolfalse ;對於自定義struct ,這兩個規則的組合。

但是: 不要這樣做。 當它僅適用於一些精選類型時, 請勿創建此通用方法 通常,通用方法適用於所有類型。 (您可以使用where T : …通用參數約束來約束有效類型,但這不會改變基本思想。)

在您的情況下,通用方法僅適用於intlongfloatdoubledecimal等幾種類型。您甚至必須已經在通用方法中檢查了這些類型,以便您可以向后推。方法( int.TryParsedouble.TryParse等)。 這是一個很大的信號,說明您的方法根本不應該通用。

ParseInt以前的擴展方法ParseIntParseSingleParseDouble等。這是更好的設計。

暫無
暫無

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

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