为什么在尝试在C#中创建类级别的结构数组时出错?

时间:2017-11-19 20:59:12

标签: c#

我一直在:

  

数组初始值设定项只能在变量或字段中使用   初始化。请尝试使用新表达式。

我不知道为什么。这是不可能用C#。类似的构造适用于简单类型,如int或float。

public struct UnitObject 
{
    public float    v;
    public string   t;
    public string   d;
}

public class UnitStandard
{
    public UnitObject[] UnitDict = new UnitObject[] { { 1f, "s", "s" } };
} 

使用.NET 4.5。

2 个答案:

答案 0 :(得分:3)

您希望如何工作并不完全清楚,但在c#中,它不是有效的语法。您有两种选择:

  1. 使用构造函数

    public struct UnitObject
    {
        public UnitObject(float v, string t, string d)
        {
            this.v = v;
            this.t = t;
            this.d = d;
        }
    }
    
    public UnitObject[] UnitDict = new UnitObject[] { new UnitObject(1, "s", "s") };
    
  2. 使用对象初始值设定项

    public UnitObject[] UnitDict = new UnitObject[] 
    { 
        new UnitObject 
        { 
            v = 1, 
            t = "s", 
            d = "s" 
        } 
    };
    
  3. 作为旁注:vtd是可怕的名字,因为它们不提供意义,公众成员应该遵循PascalCase。

    为了遵循正确的不变性模式,请使用:

    public struct UnitObject
    {
        public float V { get; private set; }
        public string T { get; private set; }
        public string D { get; private set; }
    
        public UnitObject(float v, string t, string d)
        {
            V = v;
            T = t;
            D = d;
        }
    }
    

答案 1 :(得分:1)

我在这里回答我自己的问题,因为我被告知这是帮助他人的最佳方式 - 而不是编辑问题。

我通过添加构造函数来实现此目的:

public struct UnitObject 
{
    public float    v;
    public string   t;
    public string   d;

    public UnitObject(float val, string s1, string s2)
    {
       v = val; t = s1; d = s2;
     }
}

public class UnitStandard
{
    public UnitObject[] UnitDict = new UnitObject[] { new UnitObject( 1f, "s", "s" ) };
} 

但Camilo的答案当然要优雅得多。