积极答复者
编译错误CS0460怎么解决?MSDN只是描述了情况,但是没有说明如何解决

问题
答案
-
2楼mark zhou的解释看起来有些问题
CS0460是指 override和显式接口实现 中都不能直接指定"约束",即where T: class这种东西得去掉
基类型中已经定义了约束,那么继承者必须忠实基类的约束定义,没有必要重新再定义一次
考虑3楼提供的例子,方法F1问题不大,ExpImpl和I,都是把T约束为BaseClass,这里ExpImpl的where T :BaseClass多余了
但F2问题就来了,在I中,T被约束为struct,但在ExpImpl中,T被约束为class,那么
I x = new ExpImpl(); // 必须OK,向上的转换必须成功
x.F2<int>(); // 这就让人纠结了
ExpImpl中F2的实现究竟认为T是一个struct还是class呢?
所以CS0460的设计是相当合理的
- 已标记为答案 nEVERcRASH 2011年9月16日 15:51
全部回复
-
多谢回复。那么请教下面这个MSDN上的例子,应该如何修改才能编译通过?
// CS0460.cs
// compile with: /target:library
class BaseClass
{
BaseClass() { }
}
interface I
{
void F1<T>() where T : BaseClass;
void F2<T>() where T : struct;
void F3<T>() where T : BaseClass;
}
class ExpImpl : I
{
void I.F1<T>() where T : BaseClass {} // CS0460
void I.F2<T>() where T : class {} // CS0460
}
-
2楼mark zhou的解释看起来有些问题
CS0460是指 override和显式接口实现 中都不能直接指定"约束",即where T: class这种东西得去掉
基类型中已经定义了约束,那么继承者必须忠实基类的约束定义,没有必要重新再定义一次
考虑3楼提供的例子,方法F1问题不大,ExpImpl和I,都是把T约束为BaseClass,这里ExpImpl的where T :BaseClass多余了
但F2问题就来了,在I中,T被约束为struct,但在ExpImpl中,T被约束为class,那么
I x = new ExpImpl(); // 必须OK,向上的转换必须成功
x.F2<int>(); // 这就让人纠结了
ExpImpl中F2的实现究竟认为T是一个struct还是class呢?
所以CS0460的设计是相当合理的
- 已标记为答案 nEVERcRASH 2011年9月16日 15:51