2011-10-11 6 views
5

の定義が間違っている私は、このように私の構造体を定義していますこのStructタイプ

struct Test 
{ 
    private string assayName; 
    public string AssayName { get; set; } 

    private string oldUnitName; 
    public string OldUnitName { get; set; } 

    private string newUnitName; 
    public string NewUnitName { get; set; } 

    public Test(string name, string oldValue, string newValue) 
    { 
     assayName = name; 
     oldUnitName = oldValue; 
     newUnitName = newValue; 
    } 

} 

が、それは私に次のエラーできます:あなたは実際には何をしていない

"Error 13 Backing field for automatically implemented property 'EnterResults.frmApplication.Test.NewUnitName' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer."

+2

を参照してください:コンパイラは 'assayName'はバッキングフィールドであることを前提としていません'AssayName'の場合... –

+0

プロパティはバッキングフィールドにアクセスしたり、変更したりしません。 – canon

+1

サイドノートでは、 'struct'ではなく' class'を使いたいと思うかもしれません。 –

答えて

6

まあ、実際には2つの問題がある :

1.Your自動プロパティを使用したが、その後もフィールドを提供するには、間には配線がありません二。

2.自動プロパティを使用する場合、これは構造体なので、最初に初期化する必要があります。デフォルトのコンストラクタの呼び出しでこれを行うことができます。だから、改訂版は、次のようになります。

struct Test 
{ 
    public Test(string name, string oldValue, string newValue) 
     : this() 
    { 
     AssayName = name; 
     OldUnitName = oldValue; 
     NewUnitName = newValue; 
    } 

    public string AssayName { get; private set; } 
    public string OldUnitValue { get; private set; } 
    public string NewUnitValue { get; private set; } 
} 
+0

が正しい。ありがとう – Bohn

6

をプロパティと。これを試してください:

struct Test 
{ 
    public string AssayName { get; set; } 
    public string OldUnitName { get; set; } 
    public string NewUnitName { get; set; } 

    public Test(string name, string oldValue, string newValue) : this() 
    { 
     AssayName = name; 
     OldUnitName = oldValue; 
     NewUnitName = newValue; 
    } 
} 

これは構造体の初期化と関係があります。私が追加したデフォルトのコンストラクタへの呼び出しは、それを幸せにするようです:)

"それは幸せに見えます。私は構造体がどのように初期化されているかに結びついている実際の答えを見て回りました。デフォルトコンストラクタを呼び出すと、構造体が使用される前にフィールドが初期化されます。

2

あなたはAutomatically Implemented Propertyを作成しようとされていますが、(明らかな使用を持っていない)「バッキングフィールド」を定義している、とあなたはあなたのコンストラクタでそれらのバックアップフィールドに値を代入し、完全に手つかずのあなたの特性を残しています。

3

フィールドassayName,oldUnitNameおよびnewUnitNameを削除できます。次に、あなたのコンストラクタで自動的に実装プロパティを参照してください。

public Test(string name, string oldValue, string newValue) 
{ 
    AssayName = name; 
    OldUnitName = oldValue; 
    NewUnitName = newValue; 
} 
2

また、デフォルトのコンストラクタを呼び出すことができます。

public Test(string name, string oldValue, string newValue) : this() 
{ 
    assayName = name; 
    oldUnitName = oldValue; 
    newUnitName = newValue; 
} 

は手始めにhere

+0

あなたの公開変数と私的変数が関連しているとは思いませんでした(コーディングゴリラの回答を参照) – KevinDTimm