Dot-Net

約束到介面的泛型參數與僅使用介面之間的區別

  • September 2, 2013

這有什麼區別:

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)。

引用自:https://stackoverflow.com/questions/595260