7

我有一个带有静态成员的内部静态类 MyLists

internal static ImmutableArray<string> MyList = new ImmutableArray<string> { "asd", "qwe" };

在另一个公共测试类 Tests 中,我有一个 MyTest 函数,用于选择和比较列表。我得到一个

Additional information: The type initializer for 'TestMyLists' threw an exception. Object reference not set to an instance of an object.

[TestClass]
public class MyTests {
  [TestMethod]
  public void TestMyLists() {
    var list = MyLists.MyList.Select(s => s + ".foo");
  }
}

当我调试时,我看到静态 ImmutableArray 为 value = Uninitialized。为什么?

4

1 回答 1

11

正如MSDN上提到的,对于这种类型的数组,您应该使用Create()方法而不是使用构造函数:

internal static ImmutableArray<string> List = ImmutableArray.Create("asd", "qwe");

关于原因,我将向您指出 Immo Landwerth 的文章,他在其中描述:

的默认值ImmutableArray<T>具有使用空引用初始化的基础数组。在这种情况下,它的行为方式ImmutableArray<T>与使用空数组初始化的 an 相同,即Length属性返回 0 并对其进行迭代根本不会产生任何值。在大多数情况下,这是您所期望的行为。但是,在某些情况下,您可能想知道底层数组尚未初始化。因此,如果底层数组是引用,则ImmutableArray<T>提供返回 true 的属性。例如,您可以使用该信息来实现延迟初始化:IsDefaultnull

于 2016-11-16T13:40:08.920 回答