4

次のコードは、構造体で暗黙的なプロパティを使用できないことを示しています。

public struct LimitfailureRecord
{
   public LimitfailureRecord(string sampleCode)
   {
      SampleCode = sampleCode;
   }

   public string SampleCode {get; set;}
   {
   }
}

エラーメッセージが表示されてコンパイルに失敗します

「自動的に実装されたプロパティ 'blahblah.LimitfailureRecord.SampleCode' のバッキング フィールドは、制御が呼び出し元に返される前に完全に割り当てられる必要があります。コンストラクター初期化子から既定のコンストラクターを呼び出すことを検討してください。」

構造体をクラスに変更しても問題ありません。これを構造体として機能させるにはどうすればよいですか? 回避できるのであれば、バッキング フィールドの長さ (これは実際のコードの大幅に簡略化されたバージョンです) には行きたくありません。

4

3 に答える 3

5

構造体では、他のすべてのコンストラクターでデフォルトのコンストラクターを呼び出す必要があります。

public LimitfailureRecord(string sampleCode) : this()
{
    SampleCode = sampleCode;
}
于 2013-04-12T15:49:29.967 に答える
2

次のようにコンストラクター チェーンを使用します。

public LimitfailureRecord(string sampleCode)
    : this()
{
    ...
}

その理由は、説明されているように、自動実装されたプロパティがバッキング用の (生成された) インスタンス フィールドを導入するためです。すべてのインスタンス フィールドは、 のインスタンス コンストラクターでstructに割り当てる必要があります。

実際、あなたが引用したエラーテキストは、修正をかなりよく説明しています。

その他:setプロパティのアクセサーを保持publicすると、変更可能な構造体が作成されます。ほとんどの人は、変更可能な構造体は避けるべきであり、値によるコピーのセマンティクスと既存の構造体値を変更する可能性 (のようにrecord.SampleCode = "Here's a new string for an old object";) がうまくいかないため、「悪」であることに同意します。可変構造体と不変構造体のスレッドを確認してください。

于 2013-04-12T15:49:12.527 に答える
1

デフォルトのコンストラクターを呼び出すか、メソッド名を変更する必要があります。

そう;

      public struct LimitfailureRecord
      {
          public void init(string sampleCode)
          {
              SampleCode = sampleCode;
          }

          public string SampleCode { get; set; }
      }

機能するか、メソッド定義を作成します。LimitfailureRecord(string sampleCode) : this()

物事を機能させるために1回の呼び出ししか必要ないため、後者の方が優れています。あなたがしているinitルートに行く場合は、後でnew LimiFfailureRecord呼び出しますinit。C# の構造体では、単にデフォルトのコンストラクターを呼び出す必要があります。これはクラスの場合には当てはまらないため、クラスに変更するとコンパイルされます。

于 2013-04-12T15:51:40.127 に答える