2010-06-14 98 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>