Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在单行lambda表达式中使用函数而不是sub导致的错误_.net_Vb.net_Lambda - Fatal编程技术网

.net 在单行lambda表达式中使用函数而不是sub导致的错误

.net 在单行lambda表达式中使用函数而不是sub导致的错误,.net,vb.net,lambda,.net,Vb.net,Lambda,我刚刚遇到一个情况,一位同事写了一个bug,尽管我们知道如何修复它,但我们不理解它为什么会发生。我已经使用lamda表达式很多年了,但是我对C#比VB更有经验,显然我对某些东西有一个基本的误解 在VisualStudio2010和.NET3.5中可以看到以下内容 我将其简化为以下简单的测试代码,再现了类似的场景: 在windows窗体上,我放置以下命令,只需执行lambda,然后将测试对象的值打印到文本框中: Private Sub ExecuteAction(ByVal action As A

我刚刚遇到一个情况,一位同事写了一个bug,尽管我们知道如何修复它,但我们不理解它为什么会发生。我已经使用lamda表达式很多年了,但是我对C#比VB更有经验,显然我对某些东西有一个基本的误解

在VisualStudio2010和.NET3.5中可以看到以下内容

我将其简化为以下简单的测试代码,再现了类似的场景:

在windows窗体上,我放置以下命令,只需执行lambda,然后将测试对象的值打印到文本框中:

Private Sub ExecuteAction(ByVal action As Action(Of TestClass))
    Dim testObj As New TestClass()
    action(testObj)
    TextBox1.Text = testObj.MyInteger
End Sub

Public Class TestClass
    Public MyInteger As Integer
End Class
然后我运行一些代码,用lambda调用它

在以下情况下,文本框中的输出是15,正如我所期望的:

ExecuteAction(Sub(obj) obj.MyInteger = 15)
在以下情况下,输出也如我所期望的那样为15(它确实生成了一个警告,因为没有指定返回值,这是我所理解的,并且很好,因为它做了预期的事情):

在以下情况下,输出为0,我不理解原因:

ExecuteAction(Function(obj) obj.MyInteger = 15)
为什么在最后一个场景中,对象的值没有更改为15?我需要了解单行函数lambdas和多行函数lambdas之间的区别,看看是否需要检查我们所有产品中是否存在类似的bug。它编译得很好,不会产生警告,这对我们的使用极为危险

我尝试了以下方法,以查看在任何隐式返回之前强制执行是否有任何区别,但没有:

ExecuteAction(Function(obj) (obj.MyInteger = 15))

多行函数和单行函数的区别在于,一个包含语句,另一个包含表达式

obj.MyInteger=15
为语句时,则
=
为赋值运算符。当它是表达式时,
=
是比较运算符

单行函数的多行版本为:

ExecuteAction(Function(obj)
  Return obj.MyInteger = 15
End Function)

这将比较这些值并返回一个布尔值。由于(TestClass的)操作是预期的,因此对返回值的类型没有要求,因此您不会注意到它返回的是布尔值。

谢谢,这很有意义。显然,直接的情况不可能发生在C#中,因为它有==用于比较,=用于赋值,这让我很困惑。我将确保我们的编程标准得到更新,并在检查这是否有可能在其他地方抓住我们的机会时做出判断。再次感谢。
ExecuteAction(Function(obj)
  Return obj.MyInteger = 15
End Function)