struct和class中使用的泛型

时间:2012-12-05 20:27:46

标签: c# class generics struct

假设我们使用以下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 个答案:

答案 0 :(得分:14)

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

您可以通过以下方式使代码正常工作:

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

另见Why Must I Initialize All Fields in my C# struct with a Non-Default Constructor?

答案 1 :(得分:10)

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

请注意,此处发生相同的错误:

struct Foo
{
    public int A;
    public int B;

    public Foo()
    {
        A = 1;
    }
}

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

如果没有明确定义构造函数,编译器将生成一个默认构造函数,为每个字段分配默认值(例如对象null,数字等0等)。