2011-01-04 2 views
1

필자가 작성한 일부 단위 테스트에 사용하는 엔티티의 아주 간단한 목록을 만들려고 시도하고 있지만 컴파일러가 정적 컨텍스트에서 인스턴스 변수에 액세스 할 수 없다는 불만을 제기하고 있습니다. 지금까지 볼 수 있듯이 인스턴스 변수 만 있습니다.이 컬렉션 이니셜 라이저가 정적이되는 이유는 무엇입니까?

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" 
                   } 
                 }; 
    } 
} 

말 그대로이 클래스의 모든 코드입니다. 컴파일러는

Error 1 A field initializer cannot reference the non-static field, method, or property 'EMP.Domain.Tests.Repositories.AuditTrailRepositoryTests.orgId1'

이 무엇을 fakeAuditData가 정적 컨텍스트에서 실행 생각하는 원인이되는 것을 불평? 인스턴스 메서드를 추가하고 컬렉션과 Guid에 모두 액세스 할 수있었습니다. 그래서 초기화 할 때 콜렉션이 정적인가? 그리고 이것은 한번만 초기화된다는 것을 의미 하는가?

답변

3

문제가 정말 컬렉션 이니셜 라이저 자체에 관련이 없습니다; 제공된 샘플에서 collection-initializer가 인스턴스 field-initializer의 일부라는 사실과 관련이 있습니다. 인스턴스 멤버를 참조 할 수 없습니다. 클래스의

10.5.5.2 인스턴스 필드 초기화

인스턴스 필드 변수 초기화 즉시 인스턴스 생성자 중 하나 (§ 입장에 실행 과제의 순서에 해당 : 언어 사양에서 10.11.1). 변수 이니셜 라이저는 클래스 선언에 나타나는 텍스트 순서대로 실행됩니다. 클래스 인스턴스 생성 및 초기화 프로세스는 §10.11에서 더 자세히 설명합니다.

인스턴스 필드의 변수 초기화 프로그램이 작성중인 인스턴스를 참조 할 수 없습니다. 따라서 변수 이니셜 라이저에서 단순한 이름을 통해 참조 할 수있는 컴파일 타임 오류이기 때문에이를 변수 이니셜 라이저에서 참조하는 것은 컴파일 타임 오류입니다.

+0

하지만 그는 생성되는 인스턴스의 유형 멤버를 참조하지 않습니다. – leppie

+0

그럼,'this.orgId1'을 쓰면 작동할까요? – leppie

+0

'OrganisationId = orgId1'. 거기에 암묵적인 '이'가 있습니다. 이것이 명시 적으로 추가되면 차이가 나지 않지만 컴파일 타임 오류는 있지만 다른 오류는 발생합니다. – Ani

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" 
      } 
     }; 
    } 
} 
+0

,하지만 난 오히려이 문제를 해결하는 방법에 특히보다 일반적으로 컬렉션 이니셜 라이저의 동작에 대한 자세한 궁금 단위 테스트. – ilivewithian

+0

그러나 이것은 동일한 오류를 일으킬 것입니다 (오류를 올바르게 이해 한 경우). – leppie

+0

나는 이것이 오류가 아님을 알았다. – leppie

1

이 또한 컴파일시 에러 이유 같은 이유 :

class Foo 
{ 
    int a = 5; 
    int b = a; 
} 
내가 할 수있는
관련 문제