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

时间:2015-11-16 22:40:09

标签: c# c#-6.0

这不起作用

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参数不需要初始化。为什么属性不能作为out参数传递?

2 个答案:

答案 0 :(得分:9)

我认为这是C#6.0,因为你只有get - 属性。

它不起作用,因为属性不能通过引用传递。在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);
    }
}

答案 1 :(得分:3)

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

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