Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试将值设置为只读属性时会发生什么情况?_C#_Excel - Fatal编程技术网

C# 尝试将值设置为只读属性时会发生什么情况?

C# 尝试将值设置为只读属性时会发生什么情况?,c#,excel,C#,Excel,最近我一直在与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"; &

最近我一直在与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";   <--
var charts=worksheet.ChartObjects()作为xcel.ChartObjects;
var chartObj=charts.Add(60,10200400)为xcel.ChartObject;
var图表=chartObj.图表;

chart.Name=“GicsSectorIndustry” 如果它是只读的,您可以而不是编译该代码。 这意味着它不是只读的,但文档中说要将其视为只读


重新措辞的问题:当您尝试分配给文档中表示为只读的可分配属性时,会发生什么情况?

简单回答:这有关系吗


详细回答:没有来源,很难说。您可以使用ILSpy对其进行调试,但简短的回答仍然适用。

您似乎阅读了错误的文档

我询问过您使用的类来自哪个名称空间。根据互操作程序集的文档,签名为:

public:
property System::String ^ Name { System::String ^ get(); void set(System::String ^ value); };
正如你所看到的,有一个二传手

你可以阅读更多关于它的内容

还有另一个版本(我想是一个包装器)来自ToolsforOffice。该签名不提供设置者:

public string Name { get; }
关于这一点的更多信息可以找到

互操作程序集是托管代码和非托管代码之间的桥梁,因此我有根据地猜测,第二个版本(包装器)可能是用来管理您遇到的问题,或者它可能是另一个互操作实现

正如其他人所说,如果没有提供setter,您的代码就不会编译,但在本例中它会编译。只是掩盖下有些事情出了问题

更新:

我发现两种实现之间存在以下差异:


我非常确定
chart.Name
的属性设置器已更改。如果源代码是公开的,你应该看一看,或者试试ILSpy。什么都不会发生,这就是只读的意义。想想看,如果你有一处不想改变价值的房产,你会怎么做?属性的逻辑基本相同。@Train然后我不明白为什么它会抛出
内存不足错误
,而不是
无法将值设置为只读属性
。下面是如何更改名称
Excel.ChartObject chartObjectParent=chart1.Parent为Excel.ChartObject;chartObjectParent.Name=“new Name”
因此它不是真正的只读,根据这一点,它本质上是
公共字符串名称{get;private set;}
。无论如何,编译器仍然应该抛出……您不太可能通过ILSpy(或任何其他反编译器)得到很多答案。Office interop库只是C接口的包装器,因此,如果不深入研究C代码,就很难准确地说出幕后发生了什么。