UPDATED:这个问题被标记为重复,但虽然我理解代码的问题,但是我没有解。代码是否可以仅通过更改方法体而不是方法签名来工作?不能从`Expression <Func<T1, T2>>`转换为`Expression <Func <object,object >>`
我绑来包装我的周围Expression
和Func
头,而试图建立像一个类中的下列:
public class Test<TBase>
{
private IList<Expression<Func<object, object>>> _expressions = new List<Expression<Func<object, object>>>();
public void AddExpression<T>(Expression<Func<TBase, T>> e)
{
_expressions.Add(e);
}
public void AddExpression<T1, T2>(Expression<Func<T1, T2>> e)
{
_expressions.Add(e);
}
}
我需要/想保持表情,里面其中类型的列表Func
可能会有所不同。我虽然上面的代码会工作,但事实并非如此。它失败:
Cannot convert from 'Expression<Func<TBase, T>>' to 'Expression<Func<object, object>>'
Cannot convert from 'Expression<Func<T1, T2>>' to 'Expression<Func<object, object>>'
ReSharper的说:
Argument type 'Expression<Func<TBase, T>>' is not assignable to parameter type 'Expression<Func<object, object>>'
Argument type 'Expression<Func<T1, T2>>' is not assignable to parameter type 'Expression<Func<object, object>>'
代码是否可以通过仅更改方法体而不是方法签名来工作?
'Func键'是仅在'TResult'协变,因为这是输出,但逆变在'T'因为这是输入。所以如果你有一个'Func ','string'可以被转换成'object',但是你不能只传递任何'object'到'int'中。 https://msdn.microsoft.com/zh-cn/library/dd799517(v=vs.110).aspx –
juharr
与http://stackoverflow.com/q/42951537/613130非常相似,但增加了复杂性需要转换参数和返回值。 – xanatos