【问题标题】:Compiler complains about unassigned struct variable but allows members to be assigned - why? [duplicate]编译器抱怨未分配的结构变量,但允许分配成员 - 为什么? [复制]
【发布时间】:2020-05-14 04:04:45
【问题描述】:
struct MYSTRUCT
{
 public int x;
 public int y;
 public int z;
}

        MYSTRUCT s;
        s.x = 2;
        s.y = 4;
        Console.WriteLine(s); //error on this line

这会产生编译错误

错误 CS0165:使用未分配的局部变量“s”

它提出了几个问题-首先,由于结构是值类型且不可为空,为什么需要初始化s?其次,为什么分配给s.xs.y OK,只有最后一行产生错误?

不是询问如何修复我的代码,它只是让我感兴趣,为什么必须将结构分配/初始化为值类型?

(注意:MYSTRUCT 只有简单的byte/int 成员)

【问题讨论】:

  • MYSTRUCT 长什么样子?
  • 结构确实有默认值...它们不能是null。但是 C# 仍然希望你初始化它们,如果你不这样做会抱怨。您初始化了s.xs.y,但没有初始化s 本身。至于“为什么”,唯一能告诉你的是 MS 的语言团队。
  • 这个错误的想法是强迫某人明确声明他们想要一个变量初始化为默认值并不是强迫人们这样做的坏事,当你忘记初始化时它会捕获错误它到一个实际值。由于它是一个结构,我相信除非您实际使用该变量,否则这些分配无关紧要,因此这就是错误出现在Console.WriteLine 上的原因。而且我猜他们不会对这种情况做任何特殊处理,因为可变结构一开始是个坏主意。
  • MYSTRUCT 除了xy 之外还有其他实例字段吗?

标签: c#


【解决方案1】:

您误解了您遇到的错误。如果所有实例字段都被明确分配,则结构被认为是明确分配的。这是完全有效的:

struct A
{
    public int i;
}

A a;
a.i = 1;
Console.WriteLine(a); //no error, a is considered to be definitely assigned.

但这不是:

struct A
{
    public int i;
    public int j;
}

A a;
a.i = 1;
Console.WriteLine(a); //a is not definitely assigned because a.j isn't.

如果您没有在自定义构造函数中初始化成员,该错误类似于您得到的错误:

struct A
{
    public A(int i)
    {
        this.i = i;
    } //error, j is not assigned.

    public int i;
    public int j;
}

在您的情况下,MYSTRUCT 必须具有未正确初始化或必须通过属性设置器初始化的实例字段。

简而言之,不要担心这个问题,因为只有在以下情况下才能真正初始化值类型:

  1. 是可变的
  2. 直接公开所有实例字段(不通过属性)

这两种做法通常都被认为是不好的做法,因此您可能应该避免遇到适合这两个类别的任何值类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多