Почему этот инициализатор коллекции пытается быть статичным? - PullRequest
1 голос
/ 04 января 2011

Я пытаюсь создать очень простой список сущностей, которые я использую для некоторых модульных тестов, которые я пишу, но компилятор жалуется, что я не могу получить доступ к переменной экземпляра из статического контекста. Насколько я вижу, есть только переменные экземпляра.

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 думать, что он работает в статическом контексте? Я даже добавил метод экземпляра и смог получить доступ как к коллекции, так и к руководствам. Так является ли коллекция статической при инициализации и означает ли это, что она инициализируется только один раз?

Ответы [ 3 ]

3 голосов
/ 04 января 2011

Проблема на самом деле не связана с инициализаторами коллекции; это связано с тем, что в предоставленном примере инициализатор коллекции является частью instance field-initializer. Они не могут ссылаться на какие-либо члены экземпляра. Из спецификации языка:

10.5.5.2 Инициализация поля экземпляра

Инициализаторы переменных поля экземпляра класса соответствуют последовательности присваиваний, которые выполняются сразу после входа в любой из конструкторов экземпляра (§10.11.1) этого класса. Инициализаторы переменных выполняются в текстовом порядке, в котором они появляются в объявлении класса. Процесс создания и инициализации экземпляра класса описан далее в §10.11.

Инициализатор переменной для поля экземпляра не может ссылаться на создаваемый экземпляр. Таким образом, ошибка времени компиляции для ссылки на это в инициализаторе переменной, так как это ошибка времени компиляции для инициализатора переменной для ссылки на любой элемент экземпляра через простое имя.

1 голос
/ 04 января 2011

По той же причине, что и ошибка компиляции:

class Foo
{
  int a = 5;
  int b = a;
}
1 голос
/ 04 января 2011

Вы можете использовать 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"
            }
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...