从TDelegate到Expression <TDelegate>的隐式转换在哪里声明?

水冷却器v2

实际上,有四个相关的问题:

1)为什么可以这样做?

Expression<Func<int, int>> incrementorExpression = (i => i + 1);

但是无法做到这一点?

LambdaExpression decrementorExpression = (i => i - 1);

在第二种情况下,编译器将这样报告:“无法将lambda表达式转换为类型'System.Linq.Expressions.LambdaExpression',因为它不是委托类型”

2)之间的转换TDelegateExpression<TDelegate>声明在哪里我想我记得曾经看过它,但似乎现在找不到。但是我不确定我是否看过。

3)当我这样做时:

Expression<Func<int, int>> incrementExpression = (i => ++i);

编译器说:“表达式树可能不包含赋值运算符。” 为什么?

4)然后,如果我可以这样做:

Expression<Func<int, int>> incrementorExpression = (i => i + 1);

那么,为什么我不能做这个

public Expression<Func<T>> ToExpression<T>(Func<T> func)
{
  return func;
}
用户名

您几乎已经找到答案了。

i => i + 1不是Func<int, int>这是一个lambda表达式。Lambda表达式可以转换为匹配的委托类型或匹配的表达式树类型。

如果将lambda表达式转换为委托类型,则编译器会将其编译为具有指定效果的IL代码。

如果将lambda表达式转换为表达式树类型,则编译器会将其编译为IL,IL生成一个表达式树,该树表示您在lambda表达式中编写的内容。表达式树是供库稍后进行解析的,因此,表达式树与您编写的代码紧密匹配非常重要。

Func<int, int> f = i => i + 1; // okay, creates delegate.
Expression<Func<int, int>> e = i => i + 1; // okay, creates expression tree.

无法从中获取f有关其执行的操作的信息从其委托类型可以知道,它接受int并返回int,但除此之外,它是一个黑盒。您输入数字,然后输入数字,但是您不再知道如何操作。

e另一方面,存储事实,该事实1已添加到名为的参数中i,甚至1出现在的RHS中+

e对于那些解释表达式树的库来说,存储在其中的这些额外信息通常是必不可少的,因此从Func<int, int>的隐式转换Expression<Func<int, int>>将不起作用:所需的信息不再可用。

至于LambdaExpression decrementorExpression = (i => i - 1);,这是无效的,仅是因为编译器无法确定您要创建的自定义委托类型是Expression<Func<int, int>>,anExpression<Func<int, object>>还是Expression<MyFunc>where MyFunc

最后,“表达式树可能不包含赋值运算符”,这主要是因为对于表达式树的预期用例,表达式包含赋值通常是没有意义的。但是,考虑到.NET表达式树能够表示赋值操作,这在某种程度上是任意的限制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Windows Phone 8上的Expression <TDelegate> .Compile()

来自分类Dev

Expression <TDelegate>子类的属性在C#中是固有的吗?

来自分类Dev

如何在不调用的情况下组合 Expression<TDelegate> 对象?

来自分类Dev

隐式转换Option [T]到String

来自分类Dev

结构到类并返回隐式转换

来自分类Dev

模板类型推导执行隐式数组到指针的转换

来自分类Dev

隐式Java到Scala集合转换不起作用

来自分类Dev

隐式转换失去浮点精度:“ double”到“ float”;固定?

来自分类Dev

从Scala Set到Java Set的隐式转换

来自分类Dev

从Java到Scala集合的隐式转换的成本

来自分类Dev

如何防止从char到int的隐式转换?

来自分类Dev

左值到右值隐式转换

来自分类Dev

g ++-如何禁用从0到指针类型的隐式转换?

来自分类Dev

mingw32中的Double到int隐式转换

来自分类Dev

为什么无法从int到Long隐式转换?

来自分类Dev

如何防止从int到unsigned int的隐式转换?

来自分类Dev

没有从ApplicationUser到IdentityUser的隐式引用转换

来自分类Dev

添加从unique_ptr <T>到T *的隐式转换

来自分类Dev

g ++-如何禁用从0到指针类型的隐式转换?

来自分类Dev

隐式Java到Scala集合转换不起作用

来自分类Dev

从Array [T]到IndexedSeq [T]的Scala隐式转换

来自分类Dev

从IEnumerable <int>到IEnumerable <dynamic>的隐式转换

来自分类Dev

从Java到Scala集合的隐式转换的成本

来自分类Dev

自定义类到枚举类的隐式转换

来自分类Dev

return 表达式到 bool 的隐式转换

来自分类Dev

Scala:哪个隐式参数优先?一个声明了定义方法的地方?还是在哪里调用该方法?

来自分类Dev

无法隐式转换类型'System.DateTime?' 到“ System.DateTime”。存在显式转换

来自分类Dev

无法隐式转换类型'System.DateTime?' 到“ System.DateTime”。存在显式转换

来自分类Dev

何时使用隐式等待以及在哪里使用

Related 相关文章

  1. 1

    Windows Phone 8上的Expression <TDelegate> .Compile()

  2. 2

    Expression <TDelegate>子类的属性在C#中是固有的吗?

  3. 3

    如何在不调用的情况下组合 Expression<TDelegate> 对象?

  4. 4

    隐式转换Option [T]到String

  5. 5

    结构到类并返回隐式转换

  6. 6

    模板类型推导执行隐式数组到指针的转换

  7. 7

    隐式Java到Scala集合转换不起作用

  8. 8

    隐式转换失去浮点精度:“ double”到“ float”;固定?

  9. 9

    从Scala Set到Java Set的隐式转换

  10. 10

    从Java到Scala集合的隐式转换的成本

  11. 11

    如何防止从char到int的隐式转换?

  12. 12

    左值到右值隐式转换

  13. 13

    g ++-如何禁用从0到指针类型的隐式转换?

  14. 14

    mingw32中的Double到int隐式转换

  15. 15

    为什么无法从int到Long隐式转换?

  16. 16

    如何防止从int到unsigned int的隐式转换?

  17. 17

    没有从ApplicationUser到IdentityUser的隐式引用转换

  18. 18

    添加从unique_ptr <T>到T *的隐式转换

  19. 19

    g ++-如何禁用从0到指针类型的隐式转换?

  20. 20

    隐式Java到Scala集合转换不起作用

  21. 21

    从Array [T]到IndexedSeq [T]的Scala隐式转换

  22. 22

    从IEnumerable <int>到IEnumerable <dynamic>的隐式转换

  23. 23

    从Java到Scala集合的隐式转换的成本

  24. 24

    自定义类到枚举类的隐式转换

  25. 25

    return 表达式到 bool 的隐式转换

  26. 26

    Scala:哪个隐式参数优先?一个声明了定义方法的地方?还是在哪里调用该方法?

  27. 27

    无法隐式转换类型'System.DateTime?' 到“ System.DateTime”。存在显式转换

  28. 28

    无法隐式转换类型'System.DateTime?' 到“ System.DateTime”。存在显式转换

  29. 29

    何时使用隐式等待以及在哪里使用

热门标签

归档