在C#中对方差转换进行某些限制的原因

时间:2014-07-24 23:57:13

标签: c# delegates implicit-conversion contravariance generic-variance

我对C#中实现方法代表之间关于协方差和逆变的隐式转换的方式有几个问题。

delegate void ImplicitFunction<T>(T thing);
delegate void ExplicitFunction<in T>(T thing);
delegate void AnimalFunction(Animal thing);
delegate void DogFunction(Dog thing);

static void Process<T>(T thing) {
    // ...
}
static void AnimalProcess(Animal thing) {
    // ...
}

static void Main() {

从我的理解,方差处理 关于分配a是隐含的 对不同的代表起作用,即:

    ImplicitFunction<Dog> processObject = Process<Animal>;

(从概念上讲,虽然可能不是语义上的,但我认为这是相反的。当然,如果我的任何假设是完全错误的,我会感谢你的修正。)经过数小时的仔细研究,我 相信我完全明白这是怎么回事 工作和为什么。但我也学到了 我无法从一个方法转换方法 尽管如此,键入(委托)给另一个人 它为...分配相同的值 同一类型,只需两步:

    ImplicitFunction<Animal> tempProcessor = Process<Animal>;
    ImplicitFunction<Dog> processDogConv = tempProcessor; // compile error

问题1:为什么不呢?请不要说, &#34;因为你没有使用&#39;&#39;&#34;&#34;或者&#34;因为它 不是通用类型&#34;。我想知道 这种行为的理由是什么, 与方差限制相同的方式 到位以防止传递无效类型 某些情况。 现在,我还了解到C#支持 使用关键字进行显式委托转换 &#39;在&#39;和&#39; out&#39;。像这样:

    ExplicitFunction<Animal> processAnimal = Process<Animal>;
    ExplicitFunction<Dog> processDog = processAnimal;

但是如果没有泛型,我就无法做同样的事情:

    AnimalFunction processAnimalNonGeneric = AnimalProcess;
    DogFunction processDogNonGeneric = processAnimalNonGeneric; // compile error

我有一种感觉,原因可能是这样 与隐含的原因密切相关 不支持差异转换。

问题2:但为什么?为什么我不能使用&#39; in&#39; 像这样的关键字:

delegate void AnimalFunction(in Animal thing);
delegate void DogFunction(in Dog thing);

再一次,我知道这不是怎么回事 有效,但理论是什么, &#34;我们-可以&#39; T-因为 - 假设 - 人 - 做 - 这&#34; 排除此功能的原因是什么?

}

P.S。此代码已经过编译,以确保它的行为符合我的描述,所需的只是一个包装类和两个空的Dog : Animal类。

0 个答案:

没有答案