我刚刚偶然发现了以下问题:
class Settings
{
// Let's set some default value: { 1 }
public ICollection<int> AllowedIds = new List<int>() { 1 };
}
static void Main(string[] args)
{
var s = new Settings
{
AllowedIds = { 1, 2 }
};
Console.WriteLine(string.Join(", ", s.AllowedIds)); // prints 1, 1, 2
}
我理解为什么会发生这种情况: AllowedIds = { 1, 2 }
不是赋值,而是对象初始值设定项中的集合初始值设定项,即,它是对AllowedIds.Add(1); AllowedIds.Add(2)
.
尽管如此,对我来说这是一个陷阱,因为它看起来像一个作业(因为它使用=
)。
作为一名 API/库开发人员(假设我是开发Settings
该类的人),想要坚持最小意外原则,我能做些什么来防止我的库的使用者落入这个陷阱吗?
脚注:
在那种特殊情况下,我可以使用 an
ISet/HashSet<int>
而不是ICollection/List
(因为重复对 没有意义AllowedIds
),这将产生1, 2
. 尽管如此,初始化AllowedIds = { 2 }
会产生反直觉的结果1, 2
。我在C# github repo上找到了一个相关的讨论,基本上得出的结论是,是的,这种语法令人困惑,但它是一个旧功能(2006 年引入),我们无法在不破坏向后兼容性的情况下更改它。