![](/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.