【问题标题】:why are lambdas & anonymous methods not allowed on the left side of the is or as operator?为什么在 is 或 as 运算符的左侧不允许使用 lambda 和匿名方法?
【发布时间】:2016-03-13 23:45:52
【问题描述】:

在 is 或 as 运算符的左侧不允许使用 Lambda。 MSDN

如果能用一个真实的例子进行清晰的解释,将不胜感激?

【问题讨论】:

  • 我无法想象您希望将 lambda 表达式放在 is 或 as 运算符左侧的哪个位置,您能澄清一下您的问题到底是什么吗?
  • 我试图理解那个 msdn 行,在 SO 中没有找到类似的问题,所以我问了
  • 另外,请注意您链接到的same page 中的这一行: 请注意,lambda 表达式本身没有类型,因为通用类型系统没有“lambda 表达式”的内在概念。 "

标签: c# linq lambda anonymous-methods


【解决方案1】:

Lambda 没有类型,因此,使用运算符来检查 没有类型的值的类型是没有意义的。

【讨论】:

  • 从第 123 页的 C# 规范版本 5.0 中找到的相关行:“匿名方法表达式或 lambda 表达式被归类为匿名函数 (§7.15)。表达式没有类型,但可以隐式转换为兼容的委托类型或表达式树类型。”
  • 感谢您的参考。
【解决方案2】:

我怀疑它与以下情况无关:

Func<string> x = () => "";  
bool result = x is Func<string>;

但是对于这种情况:

// This won't compile
if((() => "") is Func<string>)
{
}

...或:

// This won't compile too
Func<string> func = (() => "") as Func<string>;

Lambda 表达式和匿名方法本身没有类型,但它们在使用委托类型自动推断时很有用:

// C# compiler understands that the right part should be Func<string>
// because the expression signature and return value matches Func<string>
Func<string> func = () => "hello world";

MSDN 声明 isas 不能与匿名方法和 lambda 表达式一起使用,因为在将它们推断为某些实际的委托类型或表达式树之前,它们没有类型。

【讨论】:

  • x is Func&lt;string&gt;; 没有将 lambda 传递给 is 的第一个操作数。它传递了一个委托类型的变量,因此相关的引用不适用..
  • @Servy 我知道,这就是为什么我说“但是对于这种情况......”。我猜 OP 根本不知道链接的 MSDN 文章中描述的限制/异常的情况。
  • @Servy 另外,这是提到委托类型自动推断的主要原因
  • 我在解释为​​什么,具体来说,那个例子不适用,而不是仅仅说明 那个 它不适用(或者更糟的是,为什么人们会怀疑它不适用'不适用)。
  • "匿名方法表达式或 lambda 表达式被归类为匿名函数(第 7.15 节)。表达式没有类型,但可以隐式转换为兼容的委托类型或表达式树类型。”听起来不错的回答我...谢谢大家!
猜你喜欢
  • 2015-11-24
  • 1970-01-01
  • 2010-12-10
  • 2010-11-08
  • 1970-01-01
  • 2012-10-30
  • 2017-05-09
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多