![](/img/trans.png)
[英]What do you need a read-only property with a constructor that let's you set the values in that property for?
[英]What happens when you try to set value to a read-only property?
最近我一直在使用 C#,我遇到了这个奇怪的问题。 在阅读文档并发现该属性是只读的之前,我尝试为 excel 图表类的只读属性设置一个值。
var charts= worksheet.ChartObjects() as xcel.ChartObjects;
var chartObj = charts.Add(60,10,200,400) as xcel.ChartObject;
var chart = chartObj.Chart;
chart.Name = "GicsSectorIndustry"; <--
我收到此错误:
Insufficient memory to continue the execution of the program
当我删除该行时,代码运行良好,所以当我尝试为只读属性设置一个导致它“内存不足”的值时,它让我想知道幕后会发生什么。
如果它是只读的,则无法编译该代码。 这意味着它不是只读的,但文档说将其视为只读。
重新表述的问题:当您尝试分配给文档说视为只读的可分配属性时会发生什么?
简短的回答:重要吗?
长答案:没有来源,很难说。 您可以使用 ILSpy 对其进行调试,但简短的回答仍然适用。
您似乎正在阅读错误的文档。
我曾询问过您使用的类来自哪个命名空间。 根据 Interop 程序集的文档,签名是:
public:
property System::String ^ Name { System::String ^ get(); void set(System::String ^ value); };
如您所见,有一个 setter。
您可以在此处阅读更多相关信息。
Tools for Office 存在另一个版本(我想是一个包装器)。 该签名不提供设置器:
public string Name { get; }
可以在此处找到有关该方法的更多信息。
互操作程序集是托管和非托管代码之间的桥梁,所以我有根据的猜测是第二个版本(包装器)可能存在来管理您遇到的问题,或者它可能是另一个互操作实现。
正如其他人所说,如果没有提供 setter,你的代码就不会编译,但在这种情况下它会编译。 只是在幕后出了点问题。
更新:
我发现以下关于两种实现之间的区别:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.