为什么C#不允许参数类型逆变?

问题描述 投票:0回答:1

C#支持返回类型协变,但为什么不支持参数类型逆变。

想象一下这个例子:

abstract class Animal
{
    public abstract void PlayWith(Toy toy);
}

class PlayfulMonkey : Animal
{
    public override void PlayWith(Object toy) // PlayfulMonkey can play with anything
    {
        // Monkey playing with its object...
    }
}

C# 编译器在尝试此操作时会向您抛出错误。但我觉得允许这样做是很有意义的。

c# oop contravariance
1个回答
0
投票

您无法更改

override
中的方法签名,但您可以 重载 该方法:

class PlayfulMonkey : Animal
{
    public override void PlayWith(Toy toy) 
    {
        // Monkey playing with its toy...
    }
    
    public void PlayWith(Object obj) // PlayfulMonkey can play with anything
    {
        // Monkey playing with its object...
    }
}

请注意,重载是一个完全不同的方法,仅适用于

PlayfulMonkey
,并且您可以根据需要决定如何连接这两个方法(例如,如果对象是
Toy
,则重新路由到
Toy
版本) ,或将
toy
实例从
Toy
方法传递到
Object
方法)。

© www.soinside.com 2019 - 2024. All rights reserved.