2009-01-18 60 views
13

我已經建立了自己的泛型集合類,它是這樣定義的。限制T到字符串和int?

public class StatisticItemHits<T>{...} 

這類只能與intstring值一起使用。然而,這

public class StatisticItemHits<T> where T : string, int {...} 

將不會編譯。我究竟做錯了什麼?

+0

東西告訴我,你這樣做是因爲你還沒有意識到,隱式轉換會更好... – Will 2009-01-18 15:38:29

回答

13

類型限制旨在與Interfaces一起使用。你的示例建議你想允許從int繼承的類和字符串,這是有點廢話。我建議你設計一個接口,其中包含你將在泛型類StatisticItemHits中使用的方法,並將該接口用作限制。然而,我並沒有真正看到你的需求,也許你可以發佈一些關於你的場景的更多細節?

+0

是的,在設計採取了第二次看後,你對你的方法完全正確。謝謝你的幫助。 – Mats 2009-01-18 16:16:30

1

不能用'where'來做到這一點。你不能做'或'。

1

您不能將其限制爲where子句中的字符串和int。你可以在構造函數中檢查它,但這可能不是一個檢查的好地方。我的做法是對類和類創建抽象專門爲(半)工廠模式:

class MyRestrictedGeneric<T> 
{ 
    protected MyRestrictedGeneric() { } 


    // Create the right class depending on type T 
    public static MyRestrictedGeneric<T> Create<T>() 
    { 
     if (typeof(T) == typeof(string)) 
      return new StringImpl() as MyRestrictedGeneric<T>; 

     if (typeof(T) == typeof(int)) 
      return new IntImpl() as MyRestrictedGeneric<T>; 

     throw new InvalidOperationException("Type not supported"); 
    } 


    // The specialized implementation are protected away 
    protected class StringImpl : MyRestrictedGeneric<string> { } 
    protected class IntImpl : MyRestrictedGeneric<int> { } 
} 

這種方式可以限制類的用法,只是字符串和int 類器內部

+0

字符串不是值類型.. – driAn 2009-01-18 12:33:43

6

你可以做StatisticItemHits<T>一個抽象類,並創建兩個子類:

StatisticItemHitsInt : StatisticItemHits<int>{}

StatisticItemHitsString : StatisticItemHits<string>{}

這種方式只能有一個int和StatisticItemHits

3

正如其他的字符串表示有人說,你不能以這種方式使用類型限制。你能做的是從你的基地型專門如下:

public class StatisticItemHits <T> { } 

public class StringStatisticItemHits : StatisticItemHits<string> { } 

public class IntegerStatisticItemHits : StatisticItemHits<int> { } 

此外,由於你的基類是通用的,你將無法使用這多態。如果您需要這樣做,則使StatisticItemHits實現一個接口並使用它來引用實例。喜歡的東西:

public class StatisticItemHits <T> : IStaticticItemHits { } 

public interface IStatisticItemHits { } 
2

假設你只有兩種類型在這裏我會在這裏,而不是往下走的路線OO,只是有兩個類兩種類型。

在適用的情況下,泛型最好用於泛型。在這樣的情況下,它們使用得少得多。

您可以限制到只有結構或類類型,而且我也認爲有必須是數字或運營商基於限制(例如,必須支持+ =)

int和string是真的很不同,當然更不同比int和double。對於泛型類來說,支持不可變引用類型的字符串和int的值類型,而不支持與其中任何一個更類似的其他類型都沒有多大意義。

-2

只需使用:

where TSource : IEquatable<string>