假設我們有以下簡單的類。請注意,唯一的字段是readonly并且用于ImmutableList<int>:class Abc{ readonly ImmutableList<int> elts; public Abc(params int[] ls) => elts = ImmutableList.CreateRange(ls);}給定所示的構造函數,很容易從一些ints 創建一個實例:var result_a = new Abc(10, 20, 30);現在,我可能還想要一個可以構建Abc給定 an的構造函數IEnumerable<int>:public Abc(IEnumerable<int> ls) => elts = ImmutableList.CreateRange(ls);所以我們的類現在看起來像這樣:class Abc{ readonly ImmutableList<int> elts; public Abc(params int[] ls) => elts = ImmutableList.CreateRange(ls); public Abc(IEnumerable<int> ls) => elts = ImmutableList.CreateRange(ls);}這確實有效:var ls = new[] { 10, 20, 30 };var result_b = new Abc(ls);但是,這個構造函數有點尷尬,因為乍一看,是這樣的:new Abc(item)可能看起來像是在Abc用單個元素 ( item) 創建一個。但是如果item實際上是一個IEnumerable<int>具有多個項目的,上面的第二個構造函數將被調用。如果您查看 Microsoft ImmutableListAPI,它們實際上調用ImmutableList.CreateRange了類似于上面的第二個構造函數的靜態方法。這很好,因為我們避免了上述視覺模糊。好的,讓我們開始為我們的Abc類繪制一個類似構造函數的簡單實現:public static Abc CreateRange(IEnumerable<int> ls){ elts = ImmutableList.CreateRange(ls); ...}當然,我們在這里遇到了一個問題,因為該elts字段是readonly并且不能通過此靜態方法初始化:CreateRange那么,為我們的課程實現的好方法是Abc什么?
2 回答

慕田峪9158850
TA貢獻1794條經驗 獲得超7個贊
設置的唯一方法elts
是調用 Abc 的構造函數。
修飾符保證設置變量的readonly
唯一方法是在初始化期間readonly int i=0;
或在構造函數中。
該錯誤是由靜態方法無法訪問 的實例引起的Abc
,盡管您仍然無法修改它,因為它是readonly
.
試試這個:
public static Abc CreateRange(IEnumerable<int> ls){ return new Abc(ls);}

撒科打諢
TA貢獻1934條經驗 獲得超2個贊
我相信 SLaks 的建議是創建一個私有構造函數并從靜態方法調用它:
private Abc(IEnumerable<int> ls) => elts = ImmutableList.CreateRange(ls); public static Abc CreateRange(IEnumerable<int> ls) => new Abc(ls);
這樣,創建實例的唯一方法(沒有反射)Abc
是使用靜態方法,假設您沒有任何公共構造函數。
- 2 回答
- 0 關注
- 84 瀏覽
添加回答
舉報
0/150
提交
取消