none
编译错误CS0460怎么解决?MSDN只是描述了情况,但是没有说明如何解决 RRS feed

  • 问题

  • Dear all, 

    请问如何解决“Compiler Error CS0460”?

    Error 3 Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly

    Thanks,
    -Felix

    2011年9月16日 8:06

答案

  • 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
    2011年9月16日 12:04

全部回复

  • 也就是说显式实现的 Interface 方法不能和 override 一起被指定。因为显式实现的接口方法会从基方法继承。

    解决方法就是去掉 override。


    Mark Zhou
    2011年9月16日 10:33
  • 多谢回复。那么请教下面这个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

        }

    2011年9月16日 11:40
  • 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
    2011年9月16日 12:04
  • 非常感谢AceBear的讲解。
    2011年9月16日 15:51