CS0212或如何设置指向属性

时间:2016-10-27 06:34:56

标签: c#

我有课

public class ForAllViewModel
  {
    byte abn;
    byte abn2;
    public ObservableCollection<TArrF> a
    public class TArrF
      {
        public unsafe byte* Yk;
      }  
 }

我写的时候

a[1].Yk = &abn;
a[2].Yk = &abn2;
abn =1;
abn2 = 0;

它给了我错误

  

错误CS0212:您只能在固定语句初始值设定项中获取未固定表达式的地址。

我想要的只是在

之后
(*a[1].Yk)+=1;
(*a[2].Yk)+=1;
Console.WriteLine(abn.ToString());
Console.WriteLine(abn2.ToString());

在日志21中查看。 是的,我看到了

fixed (byte* p = &abn) { a[1].Yk = p; }

但在日志10中使用此功能。 更新: 好的,我会尝试解释我的任务。 在窗体/窗口我有很多CheckBoxes。每个CheckBox都分配给Data Base的FieldName和TableName。它用于动态构建SQL查询。 我使用类似于&#39; abn&#39;计算特定表使用的字段数。 例如: CheckBox1分配给Field1和Table1 CheckBox2分配给Field2和Table1 CheckBox3分配给Field1和Table2 CheckBox是Checked counter&#39; abn&#39;增加1.如果计数器> 0我将Table1添加到我的SQL查询和特定字段。 CheckBox未选中时,计数器减1.如果counter = 0,我从SQL查询中删除Table1。 我用指针在Delphi中解决了这个任务。现在我开始将这个项目移植到C#并坚持下去。 是的,我知道它需要修复&#39;但正如我写的那样固定(字节* p =&amp; abn){a [1] .Yk = p; }&#39;不给我正确的结果。 因为当我这样做时,你会做出一个[1] .Yk + = 1;&#39; &#39; ABN&#39;也应该成为1更大。但它没有。这意味着我以错误的方式设置指针。所以我正确搜索。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication5
{
/// <summary>
/// Логика взаимодействия для MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    byte abn, abn2;
    public class Field
    {
       public string Table;
       public string Field;
       public unsafe byte* Yk;
    }
    public ObservableCollection<Field> a;


    public MainWindow()
    {
        InitializeComponent();
        a = new ObservableCollection<Field>();
        abn = 0;
        abn = 0;
        a.Add(new Field());
        a.Add(new Field());
        a.Add(new Field());
        a.Add(new Field());
        a[1].Table="Table_1";
        a[1].Field="Field_1";
        a[2].Table="Table_1";
        a[2].Field="Field_2";
        a[3].Table="Table_2";
        a[3].Field="Field_1";
        unsafe
        {
            fixed (byte* p = &abn) { a[1].Yk = p; }
            fixed (byte* p = &abn) { a[2].Yk = p; }
            fixed (byte* p = &abn2) { a[3].Yk = p; }
        }
    }

    private void CheckEdit_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e)
    {
        unsafe
        {
            Console.WriteLine("abn BEFORE modification: "+abn.ToString());
            Console.WriteLine("abn2 BEFORE modification: " + abn2.ToString());
            DevExpress.Xpf.Editors.CheckEdit cb = sender as DevExpress.Xpf.Editors.CheckEdit;
            byte i = Convert.ToByte(cb.Tag);
            if ((bool)cb.IsChecked)
            {
                *a[i].Yk += 1;
                //if(*a[i].Yk==1) { addTabletoSQL(a[i].Table);} 
                //addFieldtoSQL(a[i].Field);
            }
            else
            {
                *a[i].Yk -= 1;
                //if(*a[i].Yk==0) { removeTablefromSQL(a[i].Table);} 
                //removeFieldfromSQL(a[i].Field);
            }
            Console.WriteLine("abn AFTER modification: " + abn.ToString());
            Console.WriteLine("abn2 AFTER modification: " + abn2.ToString());
        }
    }
}
}

添加一些行以更清楚我看到项目应该如何工作(以及它如何在Delphi中工作)和xaml

<Grid>
    <dxe:CheckEdit HorizontalAlignment="Left" Margin="39,28,0,0" VerticalAlignment="Top" Width="150" Content="Field 1" Tag="1" EditValueChanged="CheckEdit_EditValueChanged" />
    <dxe:CheckEdit HorizontalAlignment="Left" Margin="39,55,0,0" VerticalAlignment="Top" Width="150" Content="Field 2" Tag="2" EditValueChanged="CheckEdit_EditValueChanged"  />
    <dxe:CheckEdit HorizontalAlignment="Left" Margin="39,82,0,0" VerticalAlignment="Top" Width="150" Content="Field 3" Tag="3" EditValueChanged="CheckEdit_EditValueChanged"  />
</Grid>

所以,当我检查CheckBoxes abn = 2和abn2 = 1时。这是对的。但是当我取消选中时 - abn和abn2应该变为0,但它不会 second time

1 个答案:

答案 0 :(得分:0)

我建议在这个答案中对您的代码进行一些小改动,但我实际上建议您重新设计应用程序的更大部分,以使其适合WPF架构。

而不是你的代码

FieldCount abn, abn2;
public class FieldCount
{
    public byte Count { get; set; }
}
public class Field
{
    public string Name { get; set; }
    public FieldCount Yk { get; set; }
}
public ObservableCollection<Field> a;

您可以使用:

a = new ObservableCollection<Field>();
abn = new FieldCount { Count = 0 };
// note I assume you don't want to double initialize abn
abn2 = new FieldCount { Count = 0 };
// add fields to the collection
a.Add(new Field { Name = "Field X", Yk = abn });
a.Add(new Field { Name = "Field Y", Yk = abn });
a.Add(new Field { Name = "Field Z", Yk = abn2 });
a.Add(new Field());

然后相应地更改初始化:

private void CheckEdit_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e)
{
    Console.WriteLine("abn BEFORE modification: " + abn.Count.ToString());
    Console.WriteLine("abn2 BEFORE modification: " + abn2.Count.ToString());

    var cb = sender as DevExpress.Xpf.Editors.CheckEdit;
    byte i = Convert.ToByte(cb.Tag);

    if ((bool)cb.IsChecked)
    {
        a[i].Yk.Count += 1;
    }
    else
    {
        a[i].Yk.Count -= 1;
    }

    Console.WriteLine("abn AFTER modification: " + abn.Count.ToString());
    Console.WriteLine("abn2 AFTER modification: " + abn2.Count.ToString());
}

并更改已检查的事件处理程序

pd.Series

希望我没有添加任何拼写错误,现在无法编译我的更改。