几天前,我开始阅读C#手册。到目前为止,除这一件事外,我已经很清楚地理解了大多数引入的概念:
delegate T TestDelegate<in T>();
这行代码甚至都没有编译,我知道这是因为返回类型不能互变,我只是不明白为什么不能这样。
最佳答案
西奥多罗斯的答案是正确的。我想考虑这个问题的一种方式是问自己“假设这是合法的;可能会出什么问题吗?”
delegate T D<in T>(); // Suppose this were legal.
class Animal {}
class Tiger : Animal {}
class Giraffe : Animal {} // Plainly all these are legal.
...
D<Animal> da = () => new Tiger(); // A tiger is an animal, so this must be legal.
D<Giraffe> dg = da; // This is legal because T is declared contravariant in D.
Giraffe g = dg(); // This is legal, because dg returns a giraffe.
// Except that it actually returns a tiger, and now we have a tiger in
// a variable of type giraffe.
除第一个程序段外,该小程序段中的每一行显然都是正确的。该程序类型不安全,因此必须是非法的。因此,我们必须得出结论,第一行必须是非法的。