C#Struct Generic Constructor

tda*_*roy 7 c# generics constructor struct

使用此代码:

struct Foo<T1>
{
    public T1 Item1 { get; private set; }

    public Foo(T1 item1)
    {
        Item1 = item1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到这个错误:

在将控制权返回给调用者之前,必须完全分配自动实现的属性"Foo.Item1"的备份字段.考虑从构造函数初始化程序中调用默认构造函数.

我的问题是,为什么在Item1调用构造函数后属性没有完全赋值?

编辑:更改setprivate set因为此问题与可变性无关.

Meh*_*dad 15

this()在这里添加:

public Foo(T1 item1) : this()
{
    Item1 = item1;
}
Run Code Online (Sandbox Code Playgroud)

这是因为您正在分配属性,并且编译器无法推断该属性仅为变量赋值; 它可以在初始化实例之前执行其他操作,并且这是不允许的,因为结构可能具有垃圾数据.所以你必须首先使用默认构造函数初始化它,然后执行你想要的操作.

  • @Vlad:的确,编译器可能会有一条规则说,如果调用的属性是autoprop,那么我们知道除了设置字段之外它没有任何影响.但是,有两件事.(1)那是工作,我们几乎没有自动道具进入C#3; 它们几乎不符合时间表,并且(2)那意味着将自动道具更改为"普通"道具会给你一个奇怪的错误,你必须在你的构造函数上调用this().我同意这有点笨重,但至少它遵循汽车道具就像常规道具的原则. (3认同)