关于使用约束的泛型接口的继承问题

iaki2008-紫龙 2009-12-08 01:36:38
namespace NS
{
class A
{
public void F<TFrom, TTo>() where TTo : TFrom
{ }
}

interface IB
{
void F<TFrom, TTo>() where TTo : TFrom;
}

class B : IB
{
private readonly A _a = new A();

#region “显式实现”接口 IB 的成员
void IB.F<TFrom, TTo>()
{
_a.F<TFrom, TTo>();
//此处的错误信息为:The type 'TTo' must be convertible to 'TFrom' in order to use it as parameter 'TTo' in the generic method 'void NS.A.F<TFrom,TTo>()'。
//按我理解编译器应该知道此方法所实现的接口中已经规定了TTo被约束为从TFrom继承
//,但既然出现了此错误,说明编译器未智能到这地步,那么该怎么办?
//现在的要求是:在接口中一定要有约束,子类一定要“显式实现”接口。
}
#endregion
}
}
...全文
144 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ffjing 2009-12-08
  • 打赏
  • 举报
回复
原封不动的代码,编译通过

环境:
Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
iaki2008-紫龙 2009-12-08
  • 打赏
  • 举报
回复
怪了,我编译是通过的
看起来是我的ReSharp插件的BUG
iaki2008-紫龙 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qldsrx 的回复:]
另外我测试时将TFrom改为了Form,因为TForm这个类我没有,但效果应该一样的。
[/Quote]
此处用的是泛型,只代表某个具体类型,无需TFrom或From这样的具体类型
qldsrx 2009-12-08
  • 打赏
  • 举报
回复
另外我测试时将TFrom改为了Form,因为TForm这个类我没有,但效果应该一样的。
qldsrx 2009-12-08
  • 打赏
  • 举报
回复
我的是VS2008EN+SP1
iaki2008-紫龙 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qldsrx 的回复:]
引用楼主 iaki2008 的回复:
namespace NS
{
    class A
    {
        public void F <TFrom, TTo>() where TTo : TFrom
        { }
    }

    interface IB
    {
        void F <TFrom, TTo>() where TTo : TFrom;
    }

    class B : IB
    {
        private readonly A _a = new A();

        #region “显式实现”接口 IB 的成员
        void IB.F <TFrom, TTo>()
        {
            _a.F <TFrom, TTo>();
        //此处完整没有问题,编译通过。
        }
        #endregion
    }
}

楼主看来是在说笑的啊,原封不动的代码我复制到VS编译器下测试,完全正常,编译通过。
[/Quote]
我用VS2008TS+SP编译不过,请问你的版本是?
iaki2008-紫龙 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 viewstates 的回复:]
public void F <TFrom, TTo>() where TTo : TFrom
        { }

我在.NET 3.5下编译没问题。
你试下这样写
public void F <TFrom, TTo>() where TTo : TFrom,IConvertible
{ }

[/Quote]

要求是:在接口中一定要有约束,子类一定要“显式实现”接口
qldsrx 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 iaki2008 的回复:]
namespace NS
{
    class A
    {
        public void F <TFrom, TTo>() where TTo : TFrom
        { }
    }

    interface IB
    {
        void F <TFrom, TTo>() where TTo : TFrom;
    }

    class B : IB
    {
        private readonly A _a = new A();

        #region “显式实现”接口 IB 的成员
        void IB.F <TFrom, TTo>()
        {
            _a.F <TFrom, TTo>();
        //此处完整没有问题,编译通过。
        }
        #endregion
    }
}
[/Quote]
楼主看来是在说笑的啊,原封不动的代码我复制到VS编译器下测试,完全正常,编译通过。
ViewStates 2009-12-08
  • 打赏
  • 举报
回复
public void F <TFrom, TTo>() where TTo : TFrom
{ }

我在.NET 3.5下编译没问题。
你试下这样写
public void F <TFrom, TTo>() where TTo : TFrom,IConvertible
{ }
天府荣城 2009-12-08
  • 打赏
  • 举报
回复
顶下
iaki2008-紫龙 2009-12-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lianshaohua 的回复:]
void F <TFrom, TTo>() where TTo : TFrom;
在B类中改为上面的声明
[/Quote]
没用的,我早试过了,这样的话出现的错误信息是:
Constraints for explicit interface implementation method are inherited from the base method,so they cannot be specified directly
ztenv 2009-12-08
  • 打赏
  • 举报
回复
void F <TFrom, TTo>() where TTo : TFrom;
在B类中改为上面的声明

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧