为什么这在 C# 中不合法?

Why is this not legal in C#?

这行不通

public class Foo {
    private int X { get; }

    public Foo(string s) {
        int.TryParse(s, out X);
    }
}

但这行得通:

public class Foo {
    private int X { get; }

    public Foo(string s) {
        int x;
        int.TryParse(s, out x);
        X = x;
    }
}

两者有什么区别,因为out参数不需要初始化。为什么 属性 不能作为输出参数传递?

我假设这是 C# 6.0,因为你有一个 get-only 属性.

它不起作用,因为不能通过引用传递属性。在 C# 中采用 ref intout int 参数的函数类似于在 C++ 中采用 int& 的函数。

但是 int 属性 而不是 只是某个地址的 int。 属性 可以 运行 它想要在 getset 中使用的任何代码。并且该语言不应将自动实现的 属性 视为特殊的。

如果我编写如下代码会怎样?

public class Foo {
    private int X {
        get { return 0; }
        set { }
    }

    public Foo(string s) {
        int.TryParse(s, out X);
    }
}

根本没有任何 int 的地址可以传递给 TryParse。代码是否允许的规则不允许查看getset实现。

请注意,这工作正常:

public class Foo {
    private int X;

    public Foo(string s) {
        int.TryParse(s, out X);
    }
}

当您使用 out 时,在后台它实际上是一个内存地址,它被传递给您调用的函数。 属性 不是变量而是函数,您不能获取它的地址,因此不能传递 属性 来代替 out 参数。

成员变量(或局部变量)占用内存,编译器可以获取它们的地址并传递它,因此它适用于变量但不适用于属性。