2014-11-21 58 views
0

我想知道C#是否支持類泛型的隱式類型發現。泛型的隱式類型發現

例如,這樣的函數存在於方法泛型上。

我可以有以下方法:

public void Foo<T>(T obj); 

,並調用它是這樣的:

int n = 0; 
instance.Foo(n); 

正如你所看到的,我不指定<int>通用的限制。它被隱式發現,因爲我通過了一個int值。

我要完成類似的東西在一個類定義級別:

internal interface IPersistenceStrategy<E, T> : IDisposable 
    where E : UniqueEntity<T> 

我希望它被定義爲IPersistenceStrategy<MyEntity>,其中MyEntity is an UniqueEntity<int>

正如您所看到的,T類型參數正在從MyEntity中隱式發現。

但是,這不起作用。我必須提供T PARAM明確:

IPersistenceStrategy<MyEntity, int> myStrategy; 

爲什麼不工作這個功能? C#編譯器不夠智能,無法自動發現我的類型參數嗎?

有什麼方法可以完成我在找的東西嗎?

+1

提不,你不能做到這一點。 – Lee 2014-11-21 11:50:37

+0

@李爲什麼不呢? :( – 2014-11-21 11:51:17

+0

只是因爲它不在規格中。 – 2014-11-21 11:52:02

回答

0

在初始化的泛型類型聲明中沒有類型推斷。調用泛型方法時,您只能忽略通用的說法,但它不與初始化泛型類型的情況爲例:

var list = new List { 2, 3, 4 }; 

在這裏,您可能希望編譯器看到你想創建一個int列表,以便有不需要指定類型參數。但事實並非如此。

在你的具體的例子,讓我們假設編譯器已經推斷出這一點:

IPersistenceStrategy<MyEntity> myStrategy; 

IPersistenceStrategy<MyEntity,int>那麼如果在同一組件如另一聲明會發生什麼:

interface IPersistenceStrategy<T> { } 

Ofcourse這會造成歧義。所以這可能是不被允許的原因之一。