15

假设我们有以下struct使用泛型的定义:

public struct Foo<T>
{
    public T First; 
    public T Second;

    public Foo(T first)
    {
        this.First = first;
    }

}

编译器说

在将控制权返回给调用者之前,必须完全分配“Foo.Second”

但是,如果Foo是一个类,那么它编译成功。

public class Foo<T>
{
    public T First; 
    public T Second;

    public Foo(T first)
    {
        this.First = first;
    }

}

为什么?为什么编译器会以不同的方式对待它们?此外,如果第一个没有定义构造函数,Foo那么它会编译。为什么会有这种行为?

4

4 回答 4

21

这是因为编译器规则强制必须在控制离开任何构造函数之前分配结构中的所有字段。

您可以通过执行以下操作使您的代码正常工作:

public Foo(T first)
{
    this.First = first;
    this.Second = default(T);
}

另请参阅为什么必须使用非默认构造函数初始化 C# 结构中的所有字段?

于 2012-12-05T20:30:08.523 回答
15

这是一般结构的要求——它与泛型无关。您的构造函数必须为所有字段赋值。

请注意,这里也会发生同样的错误:

struct Foo
{
    public int A;
    public int B;

    public Foo()
    {
        A = 1;
    }
}
于 2012-12-05T20:29:16.527 回答
2

因为 C# 中的一条规则是,必须为结构(内联或构造函数)分配所有字段。这是因为结构性质。它与通用或非通用无关。

于 2012-12-05T20:30:11.627 回答
0

其他答案正确解释了行为,但忽略了提及问题的第二部分,所以这里是为了完成。

对于类,当您没有显式定义构造函数时,编译器将生成一个默认构造函数,该构造函数为每个字段分配默认值(例如null对象、0数字等)。

对于结构,结构总是有一个隐式的无参数构造函数来分配默认值。

于 2012-12-05T20:34:19.120 回答