2010-06-14 85 views
1

我的一位同事在一個內部論壇上發佈了一個問題,這讓我想到了這是否可以通過C#來實現。基本上,他有一個界面如下:訪問內部類型

public interface IProvider<T> 
{ 
    T GetT(); 
} 

是否有可能使用一些實現該接口的類型參數到另一個泛型類,並有機會獲得T型,而無需重新指定呢?例如:

public class Foo<P> where P : IProvider<T> 
{ 
    P p; 

    T GetInnerT() { return p.GetT(); } 
} 

這並不編譯,因爲類型T沒有定義,因此不能被用作用於IProvider參數。這是甚麼可能嗎?只是好奇!

回答

6

不,他需要Foo是通用在P均 T:

public class Foo<P, T> where P : IProvider<T> 

否則沒有TIProvider<T>約束需要注意的 - 事實上,它的聲明的一部分IProvider<T>是巧合。上述聲明中的T從的IProvider<T>完全分開(從編譯器的角度來看)。例如,這將是一個同等聲明:

public class Foo<TProvider, TProvided> where TProvider : IProvider<TProvided> 

另一件事要記住的是,中IProvider<T>實現可能多次執行它,對於不同類型的參數:

public class BigProvider : IProvider<string>, IProvider<int>, IProvider<char> 

現在會是什麼Foo<BigProvider>是什麼意思?這將是曖昧......而上面我的聲明,你會怎麼做:

var x = new Foo<BigProvider, int>(); 

意思的BigProvider的INT-提供方面。

2

不,這是不可能的,因爲您的定義不允許在聲明Foo時提供類型T。考慮:

var x = new Foo<string>(); 

什麼是T在這種情況下?在編譯時和運行時無法知道。

正如你自己所說的那樣:T這個類型沒有定義,並且要使該類有效,你必須提供一個定義方法。例如:

public class Foo<P, T> where P : IProvider<T>