为什么这个集合初始化程序试图是静态的?

时间:2011-01-04 10:33:02

标签: .net collections c#-4.0

我正在尝试创建一个非常简单的实体列表,我正在编写一些单元测试,但编译器抱怨我无法从静态上下文访问实例变量。据我所知,只有实例变量。

using System;
using System.Collections.Generic;
using EMP.Domain.Entities;
using NUnit.Framework;

namespace EMP.Domain.Tests.Repositories
{
    [TestFixture]
    public class AuditTrailRepositoryTests
    {
        private Guid orgId1 = Guid.NewGuid();

        private IList<AuditTrail> fakeAuditData = new List<AuditTrail>
                                                      {
                                                          new AuditTrail
                                                              {
                                                                  ChangeDate = new DateTime(2011, 1, 1),
                                                                  EntityName = "Test",
                                                                  OrganisationId = orgId1,
                                                                  Username = "admin"
                                                              }
                                                      };
    }
}

这就是该类中的所有代码。编译器抱怨

  

错误1字段初始值设定项无法引用非静态字段,方法或属性'EMP.Domain.Tests.Repositories.AuditTrailRepositoryTests.orgId1'

是什么导致fakeAuditData认为它在静态上下文中运行?我甚至添加了一个实例方法,并且能够访问集合和Guids。初始化时集合是静态的,这是否意味着它只被初始化一次?

3 个答案:

答案 0 :(得分:3)

问题与收集初始化者本身并没有关系;事实上,在提供的示例中,collection-initializer是实例字段初始值设定项的一部分。这些不允许引用任何实例成员。从语言规范:

10.5.5.2实例字段初始化

类的实例字段变量初始值设定项对应于在进入该类的任何一个实例构造函数(第10.11.1节)后立即执行的赋值序列。变量初始值设定项以它们出现在类声明中的文本顺序执行。类实例创建和初始化过程在第10.11节中进一步描述。

实例字段的变量初始值设定项无法引用正在创建的实例。因此,在变量初始值设定项中引用它是一个编译时错误,因为变量初始化程序通过简单名称引用任何实例成员是编译时错误。

答案 1 :(得分:1)

您可以使用TestFixtureSetUp为每个单元测试准备虚假数据:

[的TestFixture]

public class AuditTrailRepositoryTests
{
    private Guid orgId1;
    private IList<AuditTrail> fakeAuditData;

    [TestFixtureSetUp] 
    public void Init()
    {
        orgId1 = Guid.NewGuid();
        fakeAuditData = new List<AuditTrail>
        {
            new AuditTrail
            {
                ChangeDate = new DateTime(2011, 1, 1),
                EntityName = "Test",
                OrganisationId = orgId1,
                Username = "admin"
            }
        };
    }
}

答案 2 :(得分:1)

这也是编译时错误的原因相同:

class Foo
{
  int a = 5;
  int b = a;
}