gpt4 book ai didi

c# - 与 Func 作为参数的协变/逆变

转载 作者:可可西里 更新时间:2023-11-01 08:49:36 27 4
gpt4 key购买 nike

假设我有一个界面,例如

public interface IInterface<in TIn, out TOut> {
IInterface<TIn, TOut> DoSomething(TIn input);
}

TIncontra 变体,并且 TOutco-变体。

现在,我希望调用者能够指定一些要在输入值上执行的函数,所以天真地我会在接口(interface)中添加以下方法:

IInterface<TIn, TOut> DoSomethingWithFunc(Func<TIn, TOut> func);

这……行不通。 TIn现在需要协变,并且 TOut逆变。

我明白,我不能使用协变泛型类型作为方法的输入,但我认为我可以在嵌套泛型类型中使用它们,它本身指定了方差 (Func<in T1, out TResult>)。

我尝试创建一个具有协变/逆变类型的新委托(delegate)类型,并更改接口(interface)以接受这种类型的参数,但无济于事(同样的错误)。

public delegate TOut F<in TDlgIn, out TDlgOut>(TDlgIn input);

public interface IInterface<in TIn, out TOut> {
IInterface<TIn, TOut> DoSomethingWithFunc(F<TIn, TOut> func);
}

我有办法让编译器满意吗? 这甚至可能吗(例如对于其他嵌套类型或其他通用参数)?如果不是,为什么不呢?

最佳答案

这不安全,因为您可以用它来做:

public class Id<I, O> : IInterface<I, O>
{
private Func<I, O> f;
public Id(Func<I, O> f) { this.f = f; }
public IInterface<I, O> DoSomething(I i) { this.f(i); return this; }
public IInterface<I, O> DoSomethingWithFunc(Func<I, O> newF) {
this.f = newF;
return this;
}
}

然后

Func<Animal, string> fa;
IInterface<object, string> oi = new Id<object, string>(_ => "");
Interface<Monkey, string> mi = oi; //safe
IInterface<Monkey, string> mi2 = mi.DoSomethingWithFunc(fa);
oi.DoSomething("not an animal!");

此时您将通过 stringFunc<Animal, string> .

关于c# - 与 Func<in T1, out TResult> 作为参数的协变/逆变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35480709/

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