Dot-Net
約束到介面的泛型參數與僅使用介面之間的區別
這有什麼區別:
void MyMethod(IMyInterface value) { //... }還有這個:
void MyMethod<T>(T value) where T : IMyInterface { //... }
主要的功能區別是您可以知道泛型方法內部對象的實際類型。T 參數將包含在某些情況下可能有利的實際類型。
在非泛型情況下,您不能保證訪問對象的基礎類型。您可以獲取大多數類型 value.GetType() 但使用者可以傳遞 Null 並阻止您。
Jared 提到了一些要點。另一個有趣的:使用泛型,只要你基本上不碰它,你就可以避免值類型的裝箱……所以我可以有一個
struct Foo : IMyInterface並將它傳遞進去,它不會被裝箱。集合之類的差異變得更加明顯:
static void Foo(IEnumerable<IMyInterface> data) {}對比
static void Foo<T>(IEnumerable<T> data) where T : IMyInterface {}現在,由於 C# 3.0 沒有共變異數(數組除外),我不能將 a 傳遞
List<Bar>給頂部,即使Bar : IMyInterface- 但我可以使用第二個(隱式T = Bar)。