![](/img/trans.png)
[英]Casting interface with generic parameter implemented by class without generic parameter
[英]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.