我已經建立了自己的泛型集合類,它是這樣定義的。限制T到字符串和int?
public class StatisticItemHits<T>{...}
這類只能與int
和string
值一起使用。然而,這
public class StatisticItemHits<T> where T : string, int {...}
將不會編譯。我究竟做錯了什麼?
我已經建立了自己的泛型集合類,它是這樣定義的。限制T到字符串和int?
public class StatisticItemHits<T>{...}
這類只能與int
和string
值一起使用。然而,這
public class StatisticItemHits<T> where T : string, int {...}
將不會編譯。我究竟做錯了什麼?
類型限制旨在與Interfaces一起使用。你的示例建議你想允許從int繼承的類和字符串,這是有點廢話。我建議你設計一個接口,其中包含你將在泛型類StatisticItemHits中使用的方法,並將該接口用作限制。然而,我並沒有真正看到你的需求,也許你可以發佈一些關於你的場景的更多細節?
是的,在設計採取了第二次看後,你對你的方法完全正確。謝謝你的幫助。 – Mats 2009-01-18 16:16:30
不能用'where'來做到這一點。你不能做'或'。
您不能將其限制爲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 類器內部。
字符串不是值類型.. – driAn 2009-01-18 12:33:43
你可以做StatisticItemHits<T>
一個抽象類,並創建兩個子類:
StatisticItemHitsInt : StatisticItemHits<int>{}
StatisticItemHitsString : StatisticItemHits<string>{}
這種方式只能有一個int和StatisticItemHits
正如其他的字符串表示有人說,你不能以這種方式使用類型限制。你能做的是從你的基地型專門如下:
public class StatisticItemHits <T> { }
public class StringStatisticItemHits : StatisticItemHits<string> { }
public class IntegerStatisticItemHits : StatisticItemHits<int> { }
此外,由於你的基類是通用的,你將無法使用這多態。如果您需要這樣做,則使StatisticItemHits實現一個接口並使用它來引用實例。喜歡的東西:
public class StatisticItemHits <T> : IStaticticItemHits { }
public interface IStatisticItemHits { }
假設你只有兩種類型在這裏我會在這裏,而不是往下走的路線OO,只是有兩個類兩種類型。
在適用的情況下,泛型最好用於泛型。在這樣的情況下,它們使用得少得多。
您可以限制到只有結構或類類型,而且我也認爲有必須是數字或運營商基於限制(例如,必須支持+ =)
int和string是真的很不同,當然更不同比int和double。對於泛型類來說,支持不可變引用類型的字符串和int的值類型,而不支持與其中任何一個更類似的其他類型都沒有多大意義。
只需使用:
where TSource : IEquatable<string>
東西告訴我,你這樣做是因爲你還沒有意識到,隱式轉換會更好... – Will 2009-01-18 15:38:29