0

我正处于开始掌握逆变的地步,尽管我正在尝试找出可以使用接口代替的优势是什么。显然我错过了一些东西。

这是 c#4 示例

class Dog : Animal {
        public Dog(string name) : base(name) { }
    }

    class Animal {

        string _name;

        public Animal(string name) {
            _name = name;
        }

        public void Walk() {
            Console.WriteLine(_name + " is walking");
        }
    }

 Action<Animal> MakeItMove = (ani) => { ani.Walk(); };

            Action<Dog> MakeItWalk = MakeItMove;

            MakeItWalk(new Dog("Sandy"));

在 c# 的早期版本中工作的相同示例

class Dog : Animal {
        public Dog(string name) : base(name) { }
    }

    class Animal : IAnimal {

        string _name;

        public Animal(string name) {
            _name = name;
        }

        public void Walk() {
            Console.WriteLine(_name + " is walking");
        }
    }

    interface IAnimal {

        void Walk();
    }

    Action<IAnimal> MakeItMove = (ani) => { ani.Walk(); };

                Action<IAnimal> MakeItWalk = MakeItMove;

                MakeItWalk(new Dog("Sandy"));

这些可能不是最好的例子,但我似乎仍然无法“明白”。动作委托上定义的 in 键是否只是一种简写的语法方式,比如 lambda 是委托的?

4

1 回答 1

2

逆变是这适用于接口的原因。方法调用允许参数类型逆变(和返回类型协方差)。

可以有不止一种方法来解决同一个问题。

考虑到有时您无法控制类结构。如果你不能改变 的定义Dog怎么办?如果没有类型差异,您的任务突然变得更加困难。

协变和逆变不是要解决的问题,它们是语言特性,就像泛型类型一样。在泛型类型存在之前,您可以在 .NET 1.x 中使用泛型类型执行的所有操作,并且仍然可以使用大量装箱和强制转换。你应该?这完全取决于您的要求。

于 2010-04-23T02:03:37.353 回答