在C#中如何给结构体赋值一个值列表?

5

我有一个结构体(.NET 3.5):

struct ColumnHeadings 
        { 
            public string Name ; 
            public int Width ; 
        } ;

当我试图将一个值列表分配给该结构体时,会出现“无法隐式转换类型为字符串/整数到…”的错误:

private void doSomething()
{
    ColumnHeadings[,] ch = new ColumnHeadings[,]{{"column1",100},
                {"column2",100},{"column3",100}};
}

结构体的值可以像多维数组一样进行赋值吗?还是必须使用赋值语句来赋值呢?
ch.Name = "column 1";

更新:

感谢Marc的优秀反馈,正确的解决方案如下:

结构体:

struct ColumnHeadings
        {
            private readonly string name;
            private readonly int width;
            public string Name { get { return name; } }
            public int Width { get { return width; } }
            public ColumnHeadings(string name, int width)
            {
                this.name = name;
                this.width = width;
            }
        } 

然后在这个方法中:

 var ch = new[]{new ColumnHeadings("column1",100),
            new ColumnHeadings("column2",100),
            new ColumnHeadings("column3",100)};

以下是为什么可变结构体不是一个好主意的链接


出于好奇,为什么ColumnHeadings是二维的? - C. Ross
@ C. Ross - 这是2D的,因为我们试图将数组/结构组合在一起... :) - John M
一个二维数组必须包含同类数据;实际上,这是一个每个元素有两个值的一维数组 - 相当不同。 - Marc Gravell
1个回答

8
首先,这可能根本不应该是一个struct
语法将是:
ColumnHeadings[] ch = new ColumnHeadings[]{
    new ColumnHeadings{Name="column1",Width=100},
    new ColumnHeadings{Name="column2",Width=100}
};

此外,您还需要处理公共字段的问题,以及这是可变结构体的事实 - 这两个都很危险。不,真的。

我建议添加一个构造函数:

var ch = new []{
     new ColumnHeadings("column1", 100),
     new ColumnHeadings("column2", 100)
};

使用:

struct ColumnHeadings
{
    private readonly string name;
    private readonly int width;
    public string Name { get { return name; } }
    public int Width { get { return width; } }
    public ColumnHeadings(string name, int width)
    {
        this.name = name;
        this.width = width;
    }
}

这样就更有意义了,但这是多维的。如果使用二维数组,它会如何工作? - C. Ross
@CRoss - 请看我在问题上的评论;在我看来,2-d是一个错误。 - Marc Gravell
@Marc - 为什么不使用 public string Name { get; private set; } - Shadow The Spring Wizard
需要这样写吗:public ColumnHeadings(string name, int width) : this() { ... }?我非常确定需要,因为它是一个结构体 :) - myermian
@Shadow,因为我不喜欢每次在构造函数中调用“:this()”。 - Marc Gravell
@myermian 不,它不会;只有在构造函数期间未显式设置每个字段时才会出现这种情况。我在构造函数中确实设置了每个字段,因此我不需要调用 : this()。顺便说一句 - 如果字段是公共的,你甚至不需要调用构造函数 - 你可以这样做:SomeStruct val; val.Foo = 123; val.Bar = "abc"; - 只要每个字段都被设置,它就会编译。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接