首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在覆盖虚拟方法中从接口实现协变/反变?

如何在覆盖虚拟方法中从接口实现协变/反变?
EN

Stack Overflow用户
提问于 2022-02-19 03:14:53
回答 1查看 78关注 0票数 1

我想在覆盖虚拟方法(从接口实现)中执行contravariance,我尝试了ICloneTo<in T>ICloneTo<out T>都获得了编译错误,如下代码所示:

代码语言:javascript
复制
interface ICloneTo<T> {
    void CloneTo(T obj);
}

abstract class Base : ICloneTo<Base> {
    public string BaseProperty { get; set; }

    public virtual void CloneTo(Base obj) {
        obj.BaseProperty = BaseProperty;
    }
}

class A : Base {
    public string AProperty { get; set; }

    public override void CloneTo(A obj /* Contravariance to A */) {
        base.CloneTo(obj);
    
        obj.AProperty = AProperty;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-02-19 03:25:17

此时,在C#中不存在重写方法的参数对方差.

这是我发现的最接近它的讨论:https://github.com/dotnet/csharplang/discussions/3562

但是,通过一些通用的花招,您可以得到:

代码语言:javascript
复制
    interface ICloneTo<T>
    {
        void CloneTo(T obj);
    }

    abstract class Base<T> : ICloneTo<T>
        where T : Base<T>
    {
        public string BaseProperty { get; set; }

        public virtual void CloneTo(T obj)
        {
            obj.BaseProperty = BaseProperty;
            throw new NotImplementedException();
        }
    }

    class A : Base<A>
    {
        public string AProperty { get; set; }

        public override void CloneTo(A obj /* Contravariance to A */)
        {
            base.CloneTo(obj);

            obj.AProperty = AProperty;
        }
    }

尽管有更好的方法来解决你想要解决的任何问题.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71181878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档