这不起作用
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参数传递?
答案 0 :(得分:9)
我认为这是C#6.0,因为你只有get
- 属性。
它不起作用,因为属性不能通过引用传递。在C#中使用ref int
或out int
参数的函数就像在C ++中使用int&
的函数。
但是int
属性不只是某个地址的int
。属性可以在get
和set
中运行它想要的任何代码。并且该语言不应将自动实现的属性视为特殊属性。
如果我编写如下代码怎么办?
public class Foo {
private int X {
get { return 0; }
set { }
}
public Foo(string s) {
int.TryParse(s, out X);
}
}
int
没有任何地址传递给TryParse
。关于代码是否允许的规则不允许查看get
和set
实现。
请注意,这样可以正常工作:
public class Foo {
private int X;
public Foo(string s) {
int.TryParse(s, out X);
}
}
答案 1 :(得分:3)
当你使用out
时,它实际上是一个内存地址,它被传递给你调用的函数。属性不是变量而是函数,您不能获取其地址,因此无法传递属性来代替out
参数。
成员变量(或局部变量)占用内存,编译器可以获取它们的地址并传递它,以便它可以使用变量但不能使用属性。