2016-11-16 117 views
4

我有一个内部静态类MyLists具有静态构件静态ImmutableArray未初始化

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

在另一个公共测试类测试我有选择并比较该列表中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为值=未初始化。为什么?

+0

od Lists或Lists.List的值是什么? – Jacek

+1

这里列出了什么?这不是一个很好的做法,可以将您的局部变量命名为预定义的变量。例如:列表 –

+0

我认为你应该使用工厂方法来创建ImmutableArray –

回答

5

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

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

关于原因,我会点你IMMO Landwerth,在那里他描述的article

默认值ImmutableArray<T>的底层数组使用空引用初始化。在这种情况下,它的行为方式与已经用空数组初始化的ImmutableArray<T>的行为相同,即Length属性返回0,并且遍历它只是不会产生任何值。在大多数情况下,这是你期望的行为。但是,在某些情况下,您可能想知道底层数组尚未初始化。出于这个原因,ImmutableArray<T>提供了属性IsDefault,如果底层数组是null引用,则返回true。例如,您可以使用该信息来执行延迟初始化:

+0

我的VS2015没有看到Create方法。任何想法为什么?我有 使用System.Collections.Immutable; 编辑:特殊照顾不应该指定 ditoslav

+0

Create()方法应该是相同的封装内ImmutableArray - https://www.nuget.org/packages/Microsoft.Bcl.Immutable/ 检查 - 从NuGet包接收如果你有最新版本和所有依赖关系需要。 – Tatranskymedved