繁体   English   中英

具有通用类参数和强制转换的函数

[英]Func with generic class parameter and casting

我有Func<>具有通用类作为输入参数。 问题是如何将其强制转换为类似的Func但具有从先前派生的参数的类? 现在下面的代码在fu2中给我null。

var fu = new Func<Envelope<Base>, object>(Simple);
var fu2 = fu as Func<Envelope<Derived>, object>;

public class Envelope<T>
{
    public T Enveloped { get; set; }
}
public class Base
{

}
public class Derived: Base
{

}

Func<T, object>T是互变的

var fu2 = fu as Func<Envelope<Derived>, object>;

如果Envelope<Derived>Envelope<Base>的子类型,它将成功。 类是不变的,但是您可以定义一个接口:

public interface IEnvelope<out T>
{
    T Enveloped { get; }
}

并让Envelope<T>实现它。 然后将编译以下内容:

Func<IEnvelope<Base>, object> fu = null;
Func<IEnvelope<Derived>, object> fu2 = fu;

强制转换通用表达式不起作用,因为lambda表达式之间没有协方差。

但是,您可以创建一个构造新的Envelope<Base>的表达式,并将封装的派生对象包装到其中,如下所示:

var fu = new Func<Envelope<Base>,object>(Simple);
Func<Envelope<Derived>,object> fu2 = x => fu(new Envelope<Base> {Enveloped = x.Enveloped});

新表达式使用new Envelope<Base> {Enveloped = x.Enveloped}参数调用fu ,该参数是从fu2表达式的参数构造的兼容类型的包络。

演示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM