为什么属性不能作为out参数传递?

dex*_*ter 11 .net c# parameters

例如:

    int? qID= null;

    answer.QuestionID = int.TryParse(lblID.Text, out qID.Value) ? qID : null; //Error: Property or Indexer may not be passed as an out ot ref parameter.
Run Code Online (Sandbox Code Playgroud)

从microsoft文档中可以看出:

"作为out参数传递的变量不需要初始化.但是,必须在方法返回之前为out参数赋值."

然后:

"属性不是变量,不能作为out参数传递.

那么基础.net平台设计中的原因是什么禁止通过out设置对象的属性?out的值也不一定是参考对象 - 使用值类型完全合法.那为什么不呢?

Jon*_*eet 15

这在VB中有效,但在C#中无效... VB有效地为您创建临时局部变量,调用传入局部变量的方法作为参数,然后使用局部变量的值设置属性.C#通常不会为你隐藏那种东西.

该方法本身需要一个变量作为out参数.它必须有一个存储位置,它只能写入值.不是属性,也不是它需要调用的任何东西:只是一个存储位置.财产不满足该要求.因此,方法中的编译器无法做到这一点.

因此,根据VB,编译器必须使用临时变量伪造它,或者根据C#禁止它.我个人更喜欢C#方法 - 否则看起来好像每次方法为out参数赋值时,属性都会被设置 - 当然不是这种情况.


SLa*_*aks 10

属性只是一对名为get_Something和的函数set_Something.
一个out参数接受一个字段或一个变量的引用; 传递一对函数没有任何意义.

VB.Net可以将属性作为ByRef参数传递 ; 编译器生成一个临时变量,并在调用该方法后重新为变量赋值.

但是,即使VB.Net无法处理您的情况,因为该Nullable<T>.Value属性是只读的.

  • @Max:因为这给人留下了错误的印象,IMO.它使**看起来像每次方法为其out参数赋值时,属性将被设置.情况并非如此,很容易引起混淆.我不知道在VB工作是否有历史先例,但我个人认为这是一个错误. (5认同)