簡體   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