为什么我必须在C#中指定"out"关键字?

Gat*_*ler 3 .net c# compiler-construction

在我提出问题之前,请看一下这个示例函数:

DateTime.TryParse("01/01/2000", out oDate)
Run Code Online (Sandbox Code Playgroud)

为什么我需要指定out关键字?编译器不应该从函数的定义中知道这一点吗?

我出于纯粹的好奇心问这个问题,希望我能学到一些关于编译器的新知识.

我还应该澄清一下,我特别询问C#.NET 3.5编译器.

And*_*are 17

out关键字可以由编译器隐含,但我的理解是C#团队决定使out函数调用者明确要求关键字,以提高参数性质的可见性.

  • "因为Anders Hejlsberg这么说" (2认同)

Mal*_*ist 10

编译器知道,你可能不知道.这是一种让你知道你传递的参数可以在你传递给它的函数中改变的方法.


Jar*_*Par 6

这不是关于编译器知道什么,而是关于确保开发人员意识到这个调用可以并且将改变变量X的值.

其中很多都是在C++中的根源,其中参考值不需要调用站点监视器.查看C++调用并确切地知道它将做什么是不可能的.通过引用传递的参数和C++中的值在语义上有很大差异.