我想在覆盖虚拟方法(从接口实现)中执行contravariance,我尝试了ICloneTo<in T>和ICloneTo<out T>都获得了编译错误,如下代码所示:
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;
}
}发布于 2022-02-19 03:25:17
此时,在C#中不存在重写方法的参数对方差.
这是我发现的最接近它的讨论:https://github.com/dotnet/csharplang/discussions/3562
但是,通过一些通用的花招,您可以得到:
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;
}
}尽管有更好的方法来解决你想要解决的任何问题.
https://stackoverflow.com/questions/71181878
复制相似问题