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

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

最佳答案

我假设这是 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);
    }
}

关于c# - 为什么这在 C# 中不合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33745991/

相关文章:

c# - 在 WCF REST 服务方法中获取 TLS 客户端证书

c# - 单击按钮时的音频播放问题

c# - WCF 推荐序列化多个对象的方法

c# - C#6 中的长字符串插值行不支持 Tab、CR 和 LF

wpf - XAML 中的字符串插值

c# - 在构建过程中C#6 nameof是否得到优化?

c# - 比较两个表的 ID ASP.Net MVC

c# - 任何 ORM 都可以在运行时以编程方式更改其连接字符串吗?

c# - 评估方法 System.Linq.Enumerable.ToList() 调用 QuickWatch 中的本地方法 Interop+Kernel32.FindStringOrdinal()

Azure Web 应用程序 kudu 部署 C# 6