3

独自のカスタムコンストラクターを作成しようとしていますが、base()コンストラクターに関するエラーが発生します。私もこのエラーを解決する方法を探していましたが、何も見つかりませんでした。インターネット上のすべての例は、私のものとほぼ同じコードを示しています。

Exception.csのコンテンツ全体:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace RegisService
{
public class Exceptions : Exception
{        
}

  public class ProccessIsNotStarted : Exceptions
  {
      ProccessIsNotStarted()
          : base()
      {
          //var message = "Formavimo procesas nestartuotas";
          //base(message);
      }

      ProccessIsNotStarted(string message) 
          : base(message) {}

      ProccessIsNotStarted(string message, Exception e)
          : base(message, e) {}
  }
}

最初のオーバーロードは機能しbase()ており、エラーはスローされませんでした。2番目と3番目のオーバーロードは私にそれを伝えています:

「RegisService.Exceptionsには、1(2)個の引数を取るコンストラクターが含まれていません」

私がエラーを解決しようとしてきたもう1つの方法:

ProccessIsNotStarted(string message)              
    {
        base(message);
    }

    ProccessIsNotStarted(string message, Exception e)
    {
        base(message, e);
    }

今回、VSは私に次のように言っています:

「キーワード「base」の使用は、このコンテキストでは無効です」

それで、問題はどこにありますか?base()コンストラクターに奇妙なオーバーロードがあるように見えますか、それとも不適切な方法で呼び出していますか?

4

4 に答える 4

6

クラスExceptionsは、提供するすべてのコンストラクターを定義する必要があります。のコンストラクターはSystem.Exception仮想または抽象ではありません。キーワードbaseは、すべての基本クラスのメンバーを呼び出すのではなく、クラス宣言で指定する1つの基本クラスのメンバーを呼び出します。これを見てください:

public class Exceptions : Exception
{
    public Exceptions(string message)
        : base(message) {}
}

public class ProccessIsNotStarted : Exceptions
{
    public ProccessIsNotStarted()
        : base()
    {
    }

    public ProccessIsNotStarted(string message) 
        : base(message)
    {
        // This will work, because Exceptions defines a constructor accepting a string.
    }

    public ProccessIsNotStarted(string message, Exception e)
        : base(message, e) 
    {
        // This will not work, because Exceptions does not define a constructor with (string, Exception).
    }
}

パラメータなしのコンストラクタは、デフォルトで定義されます。非表示にするには、宣言する必要がありますprivate

MSDNに関しては、例外継承階層をフラットに保つ必要があります。

独自の例外を作成する必要があるアプリケーションを設計している場合は、Exceptionクラスからカスタム例外を派生させることをお勧めします。当初、カスタム例外はApplicationExceptionクラスから派生する必要があると考えられていました。ただし、実際には、これが重要な価値を追加することはわかっていません。

このページもご覧ください。

于 2013-02-11T08:29:59.597 に答える
1

Exceptionsクラスを完全に削除し、ProccessIsNotStartedから直接継承しSystem.Exceptionます。

クラスのコンストラクターは、派生クラスに自動的に「コピー」されません。それらはを使用して利用できbaseますが、手動で定義する必要があります。

于 2013-02-11T08:26:44.213 に答える
1

baseは、チェーンの下位の基本クラスではなく、直接の基本クラスを指します。ProcessIsNotStartedクラスは、System.Exceptionではなく、RegisService.Exceptionsの直接のサブタイプです。RegisService.Exceptionsには、署名(string、Exception)または(string)を持つコンストラクターがありません。

2つのコンストラクターをRegisService.Exceptions基本クラスに追加してみてください。

于 2013-02-11T08:26:46.990 に答える
1

次のコードを調べると、次のようになります。

public class Exceptions : Exception
{        
}

コンストラクターがないことに気付くでしょう。デフォルトのパブリックコンストラクターを使用できるので、それは一種の嘘ですが、カスタム定義のコンストラクターはありません。

Exceptionthroughのコンストラクターを公開する場合は、Exceptionsそれらを定義し、そこからExceptionsを使用して呼び出す必要があります。これは、呼び出しているbase例外を継承するために呼び出されるため、コンストラクターにアクセスできないためです。baseExceptionsExceptionbase

public class Exceptions : Exception
{        
    Exceptions(string message) 
      : base(message) { }

    Exceptions(string message, Exception e)
      : base(message, e) { }
}

new Exceptions("", null)そうすれば、かなりうまくいくことができます。また、継承を使用するときに呼び出す基本コンストラクター。

この継承チェーンから何らかの価値が得られるかどうかはわかりません。別の提案のように、いわば仲介者を排除することをお勧めします。

于 2013-02-11T08:27:22.713 に答える