属性或索引器不能作为out或refparameter passing

我收到上述错误,无法解决它。 我GOOGLE了一下,但不能摆脱它。

场景:

我有财产预算是双重类的BudgetAllocate类。

在我的dataAccessLayer中,

在我的一个课上,我试图做到这一点:

double.TryParse(objReader[i].ToString(), out bd.Budget); 

这是抛出这个错误:

属性或索引器在编译时不能作为out或refparameter passing。

我甚至试过这个:

 double.TryParse(objReader[i].ToString().Equals(DBNull.Value) ? "" : objReader[i].ToString(), out bd.Budget); 

其他一切工作正常,层之间的引用是存在的。

你不能使用

 double.TryParse(objReader[i].ToString(), out bd.Budget); 

用一些variablesreplacebd.Budget。

 double k; double.TryParse(objReader[i].ToString(), out k); 

其他人给你的解决scheme,但至于为什么这是必要的:属性只是一种方法的语法糖。

例如,当你用getter和setter声明一个名为Name的属性时,编译器实际上会生成一个名为get_Name()set_Name(value) 。 然后,当您读取并写入此属性时,编译器会将这些操作转换为对这些生成的方法的调用。

当你考虑这一点的时候,很明显你为什么不能传递一个属性作为输出参数 – 你实际上是传递一个方法的引用,而不是引用一个variables ,这就是输出参数所期望的。

索引者也有类似的情况。

这是一个漏洞抽象的例子。 属性实际上是一个方法,索引器的getset访问器被编译为get_Index()和set_Index方法。 编译器做了一个了不起的工作来隐藏这个事实,例如,它会自动将一个赋值转换为相应的set_Xxx()方法的属性。

但是当你通过引用传递一个方法参数时,这会变得很糟糕。 这要求JIT编译器将一个指针传递给传入参数的内存位置。 问题是,没有一个,分配一个属性的值需要调用setter方法。 被调用的方法不能区分传递的variables和传递的属性之间的区别,因此不知道是否需要方法调用。

值得注意的是,这实际上在VB.NET中起作用。 例如:

 Class Example Public Property Prop As Integer Public Sub Test(ByRef arg As Integer) arg = 42 End Sub Public Sub Run() Test(Prop) '' No problem End Sub End Class 

VB.NET编译器通过自动生成Run方法的代码解决了这个问题,用C#表示:

 int temp = Prop; Test(ref temp); Prop = temp; 

您也可以使用哪种解决方法。 不太清楚为什么C#团队不使用相同的方法。 可能是因为他们不想隐藏潜在的昂贵的吸气和呼吸。 或者当设置者有改变属性值的副作用时,你会得到完全不可知的行为,他们会在分配后消失。 C#和VB.NET,C#之间的经典区别是“毫不奇怪”,VB.NET是“如果可以的话就让它工作”。

将out参数放入局部variables,然后将该variables设置为bd.Budget

 double tempVar = 0.0; if (double.TryParse(objReader[i].ToString(), out tempVar)) { bd.Budget = tempVar; } 

更新 :直接从MSDN:

属性不是variables,因此不能作为输出parameter passing。

http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx

可能有兴趣 – 你可以写自己的:

  //double.TryParse(, out bd.Budget); bool result = TryParse(s, value => bd.Budget = value); } public bool TryParse(string s, Action<double> setValue) { double value; var result = double.TryParse(s, out value); if (result) setValue(value); return result; } 

所以预算是一个财产,是否正确?

首先将其设置为局部variables,然后将属性值设置为该值。

 double t = 0; double.TryParse(objReader[i].ToString(), out t); bd.Budget = t;