2011-01-04 14 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" 
                   } 
                 }; 
    } 
} 

これは文字通り、この時点でクラス内のすべてのコードです。コンパイラはfakeAuditDataは、それが静的コンテキストで実行されていると思うする原因は何

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

ことを不平を言っていますか?私はインスタンスメソッドを追加し、コレクションとGuidの両方にアクセスできました。それで、初期化時にコレクションは静的であり、これは一度だけ初期化されることを意味しますか?

答えて

3

問題は本当にそれ自体がコレクション初期化子とは関係がありません。提供されたサンプルでは、​​コレクション初期化子がインスタンスフィールド初期化子の一部であるという事実とは異なります。インスタンスメンバーを参照することはできません。言語仕様から:

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; 
} 
関連する問題