0

コンストラクタから同じクラスの関数を呼び出しています。しかし、それは私にエラーを与えています。

public class Connection
{
    public Connection()
    {
    }

    public Connection(string parameter) : this(GetConnection(parameter))
    {
    }

    private static string GetConnection(string parameter)
    {
        return parameter;
    }
}

しかしpublic Connection(string parameter) : this(GetConnection(parameter))、私にエラーを与えています。エラーは次のとおりです。

コンストラクター 'Test.Connection.Connection(string)' はそれ自体を呼び出すことができません。

この背後にあるエラーは何ですか。この種の呼び出しは可能ですか??

ありがとう!!!

`

4

3 に答える 3

2

この構文を使用して別のコンストラクターを呼び出すことができます(キーワードを介してこのクラスコンストラクターthis、またはキーワードを介して使用可能な基本クラスコンストラクターの1つbase)。代わりに、ここで潜在的なStackOverflowExceptionが発生しています。

あなたは単にこれを行うことができます:

public class Connection
{
    public Connection()
    {
    }

    public Connection(string parameter)
        : this()
    {
        string connectionString = GetConnection(parameter);
    }
}

トピック外:次の潜在的なStackOverflowExceptionは、コンパイラーによって既に識別できません(つまり、エラーや警告なしでコンパイルされます)が、実行時のみです。

public class Connection
{
    public Connection()
        : this(GetConnectionString())
    {
    }

    public Connection(string parameter)
        : this()
    {
    }

    public static string GetConnectionString()
    {
        //...
    }
}

詳細については、コンストラクターの使用(C#プログラミングガイド)をお読みください。

コンストラクターは、thisキーワードを使用して、同じオブジェクト内の別のコンストラクターを呼び出すことができます。ベースと同様に、これはパラメーターの有無にかかわらず使用でき、コンストラクター内のパラメーターは、これに対するパラメーターとして、または式の一部として使用できます。

c#でのベースコンストラクターの呼び出しも参照してください。

于 2012-12-20T07:40:27.697 に答える
1

文字列型のパラメーターを使用してコンストラクターを再帰的に呼び出しています。1 つはパラメーターoneを持つ 2 つのコンストラクターでparmeterless、もう1 つはパラメーターを持つコンストラクターです。呼び出し元のコンストラクターは、1 つのパラメーターを持つ唯一のコンストラクターであり、コンパイラーは、パラメーターなしのコンストラクター(他のコンストラクター) を呼び出す代わりに、呼び出し元のコンストラクターを再度呼び出します。onethis(GetConnection(parameter))

これにより、パラメーター コンストラクparameterlessターからコンストラクターが呼び出されます。one

public Connection()
{
}

public Connection(string parameter) : this()
{
}

基本クラスのコンストラクターを呼び出すには、 this() の代わりに :base() を使用する必要があります

于 2012-12-20T07:37:15.203 に答える
0

コンストラクターのスコープ内から呼び出さないのはなぜですか?

あなたはおそらくこのようなものを持つことができます:

public Connection(bool getParam = false)
    {
       if (getParam)
       {
          _param = GetConnection(parameter);
       }
    }
于 2012-12-20T07:35:07.640 に答える