我的一位同事在一个内部论坛上发布了一个问题,让我思考这是否可以通过C#实现.基本上,他有一个如下界面:
public interface IProvider<T>
{
T GetT();
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用实现该接口的东西作为另一个泛型类的类型参数,并且可以访问类型T而无需重新指定它?例如:
public class Foo<P> where P : IProvider<T>
{
P p;
T GetInnerT() { return p.GetT(); }
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为类型T没有定义,因此不能用作参数IProvider.这样的事情甚至可能吗?只是好奇!
不,他需要Foo在P 和 T 中都是通用的:
public class Foo<P, T> where P : IProvider<T>
Run Code Online (Sandbox Code Playgroud)
否则T,IProvider<T>约束无法意识到 - 事实是它是声明的一部分IProvider<T>是巧合的.的T在上面的声明是完全独立的(来自编译器的角度来看)从T在IProvider<T>.例如,这将是一个等效的声明:
public class Foo<TProvider, TProvided> where TProvider : IProvider<TProvided>
Run Code Online (Sandbox Code Playgroud)
另外要记住的是IProvider<T>,对于不同的类型参数,可以多次实现它的实现:
public class BigProvider : IProvider<string>, IProvider<int>, IProvider<char>
Run Code Online (Sandbox Code Playgroud)
现在Foo<BigProvider>意味着什么?这将是模棱两可的......而在我上面的声明中,你会做:
var x = new Foo<BigProvider, int>();
Run Code Online (Sandbox Code Playgroud)
表示提供的int方面BigProvider.
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |