当前位置: 首页 > 知识库问答 >
问题:

为什么“this”在C# 6.0自动属性初始化中不可用?

郭凡
2023-03-14

我有以下代码类:

public class Foo
{
    public Nested Bar { get; } = new Nested(this);

    public class Nested
    {
        public Nested(Foo foo)
        {
            foo.DoSomething();
        }
    }

    private void DoSomething()
    {

    }
}

但是,我得到这个编译错误:

关键字“this”在当前上下文中不可用

我可以通过简单地不使用自动属性初始值设定项来修复它,并显式地将其移动到构造函数中:

public Nested Bar { get; }

public Foo()
{
    this.Bar = new Nested(this);
}

为什么会这样?在 IL 中,自动属性初始值设定项实际上不是被转换为构造函数代码吗?

共有2个答案

常翰
2023-03-14

为什么会这样?在 IL 中,自动属性初始值设定项实际上不是被转换为构造函数代码吗?

出于同样的原因,自动实现的属性初始值设定项的规则与字段初始值设定项的规则相同。注意,属性初始化器在基类主体之前执行,就像字段初始化器一样——所以你仍然在一个“有些未初始化”的对象的上下文中;比在构造函数体中更是如此。

所以你应该想象这个属性被转换成这样:

private readonly Nested bar = new Nested(this); // Invalid

public Nested Bar
{
    get { return bar; }
}

简而言之,这个限制是为了阻止你自己陷入麻烦。如果在初始化属性时需要引用<code>这个

陶超
2023-03-14

简单地说:您不能在初始值设定项中使用<code>这个</code>。这样做的目的是防止不完整的对象逃逸-<code>嵌套(这)

private Nested _field = new Nested(this);

从本质上讲,初始值设定项旨在执行简单的初始化 - 修复98%的问题。任何涉及此内容的事情都比较复杂,您需要编写自己的构造函数 - 并将任何计时问题归咎于:)

 类似资料:
  • 我在想,是否可以使用对< code>this关键字的引用来初始化一个(引用类型)属性(当它的值为< code>null),而不使用构造函数。< br >在某些情况下,我不想使用构造函数来初始化属性,因此,如果没有人访问它,它的值将不会被创建。< br >此外,如果可能的话,我不喜欢在构造函数中将属性声明与其初始化分开。 一个典型的例子是MVVM模式编程的命令声明: 我不喜欢写三倍的成员的名字… 我

  • 本文向大家介绍iOS 在didSet中初始化属性,包括了iOS 在didSet中初始化属性的使用技巧和注意事项,需要的朋友参考一下 示例 也可以设置一个值并对其进行初始化:            

  • 问题内容: 好像我遇到了本不应该出现的问题……但我想寻求帮助。 这里有一些我没有得到的解释。 具有两个简单的类,其中一个引用另一个,如下所示; 我收到注释的编译错误。有人可以告诉我该怎么办吗? 非常感谢任何好人的帮助! 问题答案: 正如 vadian 正确指出的 那样, 您应该在以下情况下创建一个: 您不能为 依赖 于另一个实例属性的存储属性提供默认值。

  • 因此,可以将自动变量初始化为陷阱表示,而不会导致未定义的行为,但在变量中存储适当的值之前,不能使用该变量的值。 事实上,他们两个我都听不懂。

  • 问题内容: 您将如何在Swift中实现以下模式? 所述类被初始化,其中包含的词典JSON数组。这些字典用于初始化类。但是,当访问或属性时,对象的初始化会延迟进行。 问题答案: 看来这个问题已经得到了很大的回答,但是回过头来看原始帖子,这是(IMHO)Swift中相对简洁的翻译。关键是您可以链接惰性属性。请注意,我同时使用了类函数和闭包- 两者都很好。