下面是一个示例:
public class B<T> {}
public class D : B<int> {}
public class A<T, S> where T : B<S> {}
public class C : A<D, int> {}
public class Test1
{
public class test1
{
A<D, int> t = new C();
}
}我想要做的是声明C类,只说:C : A<D>。为什么我需要重复int?因为int已经是D的一部分。
test1方法也是如此。我想写:A<D> t = new C();
我怎样才能做到这一点呢?
更新
这里使用更真实的类名:
public class MyModel<T> { }
public class MyTrueModel : MyModel<int> { }
public class MyManager<T,S> where T : MyModel<S> { }
public class MyTrueManager : MyManager<MyTrueModel, int> { }
public class Test1
{
public class test1
{
MyManager<MyTrueModel, int> t = new MyManager<MyTrueModel, int>();
}
}所有的问题都来自于MyManager类。如果我能做这样的事情:MyManager<T> where T : MyModel,那就太好了。
发布于 2009-12-09 09:38:16
下面是你的代码:
public class B<T> {}
public class D : B<int> {}
public class A<T, S> where T : B<S> {}
public class C : A<D, int> {}
public class Test1 {
public class test1 {
A<D, int> t = new C();
}
}下面是等价的代码:
public class B<T> {}
public class D : B<int> {}
public class A<U, V> where U : B<V> {}
public class C : A<D, int> {}
public class Test1 {
public class test1 {
A<D, int> t = new C();
}
}关键是A<U, V>中的U是一个虚拟对象。当您将U替换为T (将V替换为S)并编写A<T, S>时,T在B<T>中不引用相同的T。这就是您必须使用C : A<D, int>的原因。如果您只编写A<D>,编译器不知道(也不应该知道;请参阅我下面关于自由变量与非绑定变量的注释),您希望在B<T>中为T使用int。
所有的问题都来自类MyManager。如果我能在
T : MyModel的地方做一些像: MyManager<T>这样的事情,那就太好了。
这是不可能的。MyModel未声明为类型。只有MyModel<T>是一个类型。更具体地说,它是一个无界泛型类型。当您指定一个类型参数(例如,MyModel<int>)时,它将是一个构造类型。
冒着进一步迷惑您的风险(在这个公认令人困惑的问题上),它可能会帮助您阅读有关free and unbounded variables的知识。
发布于 2009-12-09 09:02:00
也许我误解了你的问题。但是如果你不需要int。只需使用D即可。
public class B<T> { }
public class D : B<int> { }
public class A<T> where T : D { }
public class C : A<D> { }
public class Test1 { public class test1 { A<D> t = new C(); } }发布于 2009-12-09 09:04:16
A<D> t = new C();不会工作,因为您之前已经声明了A需要两个泛型参数。
您可以声明如下内容:
class A2<T> : A<T, int> {}然后(我认为)你可以实现A2<D> t = new C();,但我假设编译器足够聪明,能够意识到A2与C……可能不是。
这是一个实验吗?看起来你可能很难弄清楚6个月后(甚至2个月后)这应该做什么。
https://stackoverflow.com/questions/1870962
复制相似问题