gpt4 book ai didi

c# - 从协方差返回 Action 的方法

转载 作者:行者123 更新时间:2023-12-05 08:28:54 26 4
gpt4 key购买 nike

它有以下 interface :

public interface ICovariant<out T>
{
public void InputFunc(Func<T> func);
}

我收到以下编译时错误:

Invalid variance: covariant type parameter 'T' is used in contravariant position. Parameter must be input-safe

Func<T>的位置是输入Func<T>Func<out T> , 所以它是输出

好吧,我错了。获取位置相关的信息。

但是,当我添加下面的方法时,出现错误。

public interface ICovariant<out T>
{
public void InputFunc(Func<T> func);
public Action<T> ReturnAction();
}

Invalid variance: covariant type parameter 'T' is used in contravariant position. Method return type must be output-safe

Action<T>的位置是输出Action<T>Action<in T> , 所以它是输入

什么?与以前不同,这次位置无关紧要。

为什么这两个例子对彼此的看法不同?

最佳答案

Sweeper 接受的答案很好;我想提供一种稍微不同的方式来思考为什么您提议的计划是非法的。在我这样做之前,请允许我再次为这里错误消息的低质量道歉。我想不出更好的办法,显然在接下来的 15 年里它们没有太大改进。

public interface ICovariant<out T>
{
public Action<T> ReturnAction(); // Why is this illegal?
}

为什么这是非法的?尝试实现它,然后看看出了什么问题!

class Animal {...}
class Mammal : Animal {...}
// ... and so on ...
class Danger: ICovariant<Mammal>
{
public Action<Mammal> ReturnAction()
{
return (Mammal m) => { m.ProduceMilk(); };
}
}

Danger满足ICovariant<Mammal>的要求-- 它返回一个 Action ,该 Action 需要一个哺乳动物,它做了一件事 -- 让哺乳动物产奶:

ICovariant<Mammal> danger = new Danger();
Action<Mammal> action = danger.ReturnAction();
action(new Goat()); // Goat milk, mmmmm

但是ICovariant<Mammal>可转换为 ICovariant<Animal>因为它是协变的,所以我们也可以这样写:

ICovariant<Animal> danger = new Danger();
// ICov<Animal> produces an Action<Animal>
Action<Animal> action = danger.ReturnAction();
action(new Chicken());

现在我们已经给鸡挤了奶。尝试不会有任何好处。

上面几行是完全合法的;他们不可能是一个错误。为了防止这种情况发生,编译器不得不让接口(interface)本身不合法。

关于c# - 从协方差返回 Action<T> 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73216240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com