无法使用ref参数并使用生成的表列具有相同的数据

时间:2017-03-03 19:25:32

标签: c#

这是目标。能够将ConvertLength与ref参数和AutoGenerateColumns一起使用。但据我所知,字段(“b”)不能用于生成列,属性(“c”)不能用作引用。有解决方案吗?

class A
{
    public decimal b;
    public decimal c { get ; set ; }
}

void ConvertLength(ref decimal field)
{
   field = field * 2.0m;
}

class x : Form
{
  DataGridView dgv = new DataGridView();

  a[] rows = new a[5];  
  ConvertLength(ref a[0].b); 
  ConvertLength(ref a[0].c); 
  dgv.AutoGenerateColumns = true;
  dgv.DataSource = rows;
}

1 个答案:

答案 0 :(得分:2)

来自MSDN

  

属性不是变量。它们是方法,不能传递给ref参数。

因此,您无法将A.c传递给ConvertLength。您可以通过b,但请注意您必须使用ref关键字:

ConvertLength(ref a[0].b);

请注意,b也必须可以访问x类(例如publicinternal如果x位于同一个程序集中)。此外,您的ConvertLength方法需要使用2.0m作为十进制文字,而不是2.0这是一个双倍。

您几乎不需要使用ref参数,如果您使用它们,它通常表示其他问题(即code smell)。如果是我,我会遵循@Tbid的建议,如下:

decimal ConvertLength(decimal field) => field * 2.0m;

...
a[0].b = ConvertLength(a[0].b); 
a[0].c = ConvertLength(a[0].c); // works with properties or fields.

但是如果真的需要为了ref而为了AutoGenerateColumns参数和属性而拥有一个包含字段的类,那么你总是可以这样做:

class A
{
    public decimal b_field;
    public decimal b { get { return b_field; } set { b_field = value; } }

    public decimal c_field
    public decimal c { get { return c_field; } set { c_field = value; } }
}

...
ConvertLength(ref a[0].b_field); 
ConvertLength(ref a[0].c_field);