调用struct的构造函数时,获取CS0843(必须分配后备字段)

时间:2013-12-28 01:02:50

标签: c# properties struct constructor

我正在尝试复制.NET的颜色struct,它允许您使用Color.BlackColor.White等来调用颜色。这是我的代码:

    struct Material
    {
        public string FilePath { get; set; }

        public Material(string filepath) { FilePath = filepath; }

        public static Material Sand
        {
            get
            {
                return new Material("images/sand");
            }
        }

        public static Material Conrete
        {
            get
            {
                return new Material("images/conrete");
            }
        }
    }

我收到一条错误消息,说我无法在struct中使用构造函数。我正在有效地从.NET源代码(Color.cs)进行复制,这就是它的工作原理,尽管它不使用构造函数。但静态属性确实返回new Material()

构造函数CS0843上显示完整错误消息:

backing field for automatically implemented property must be fully assigned before it is returned to the caller

2 个答案:

答案 0 :(得分:3)

您可以简单地“链接”this(),如:

public Material(string filepath)
  : this()
{
  FilePath = filepath;
}

这是最常见的解决方案。

当然,你可以通过其他方式做同样的事情:

public Material(string filepath)
{
  this = default(Material);
  FilePath = filepath;
}

public Material(string filepath)
{
  this = new Material { FilePath = filepath, };
}

等等。

答案 1 :(得分:0)

你可以有一个构造函数,而不是一个零参数。

然而,编写

并不是更清楚
new Material { FilePath = "images/concrete" }

而不是

new Material("images/concrete");

可以通过调用框架提供的无参数构造函数来绕过自定义构造函数,因此不能依赖它来设置不变量。可以使用成员初始化语法设置字段和属性。所以struct构造函数并不是非常有用。