繁体   English   中英

当您尝试将值设置为只读属性时会发生什么?

[英]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,你的代码就不会编译,但在这种情况下它会编译。 只是在幕后出了点问题。

更新:

我发现以下关于两种实现之间的区别:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/86a62151-fbf0-4584-a68c-83060fb95c3d/officeinteropexcel?forum=vsto

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM