1

keyparamValueとparameterPathという名前の2つの文字列フィールドを持つconfigという名前のクラスがあります。

クラスのChooseTypeメソッドを適用すると、メソッドは異なるタイプ(IntまたはboolまたはString)で1つの変数paramValueを返す必要があります。

私はそれを次のように実装しました:

class ConfigValue
{
    public string parameterPath;
    private string paramValue;

    public ConfigValue(string ParameterPath="empty",string ParamValue="empty")
    {
        this.parameterPath = ParameterPath;
        this.paramValue = ParameterPath;
    }

    public enum RetType { RetInt=1, RetBool, RetString };



    public  T ChooseType<T>(RetType how)
    {

        {

            switch(how)
             {
                case RetType.RetInt:

                     return int.Parse(string this.paramValue);
                        break;

                case RetType.RetBool:

                    return  Boolean.Parse(string this.paramValue);
                        break;

                case RetType.RetString:

                       return this.paramValue;
                      break;
             }

         }
    }

}

しかし、次の行のスイッチ演算子でエラーが発生します。

 return int.Parse(string this.paramValue);

エラー:

ステートメントとして使用できるのは、代入、呼び出し、インクリメント、デクリメント、および新しいオブジェクト式のみです。

 return  Boolean.Parse(string this.paramValue);

エラー:

無効な式の用語'文字列'。

 return this.paramValue;

エラー:

タイプ「文字列」を「T」に暗黙的に変換することはできません。

なぜこれらのエラーが発生するのか、コードを修正するにはどうすればよいですか?

4

3 に答える 3

6

なぜこれらのエラーが発生するのですか?

コンパイラーは、何が行われるかを知らず、暗黙的に、またはからにT変換する方法も知りません。stringboolintT

どうすればコードを修正できますか?

に明示的に変換してから、次のように変換することができobjectますT

return (T) (object) int.Parse(string this.paramValue);

「経由」するための要件objectは少し奇妙です-EricLippertは、これをより詳細に説明するブログ投稿を持っています。

于 2012-07-16T11:57:47.727 に答える
1
public T ChooseType<T>(RetType how)
{
    switch (how)
    {
        case RetType.RetInt:
            return (dynamic)int.Parse(paramValue);
        case RetType.RetBool:
            return (dynamic)Boolean.Parse(paramValue);
        case RetType.RetString:
            return (dynamic)paramValue;
        default:
            throw new ArgumentException("RetType not supported", "how");
    }
}

メソッドを呼び出すときは、パラメータタイプを指定しないでください。メソッド宣言にのみ必要なパラメータータイプ。したがって、パラメータを渡すだけです。

int.Parse(this.paramValue) // you can use class members without this keyword
int.Parse(paramValue)

また、スイッチブロックにブランチを追加するdefault必要があります(メソッドに誤ったパラメーター値が渡された場合は、何かを返す必要があります)。

breakまた、すでに使用している場合は、ブランチを切り替える必要はありませんreturn

また、あるタイプを一般的な値に変換するには、を使用するdynamicか、オブジェクトを介して二重変換する必要があります。

return (dynamic)int.Parse(paramValue);
return (T)(object)int.Parse(paramValue);
于 2012-07-16T11:57:30.497 に答える
1

問題は、関数の戻り型がTになることを示していることです。Tは任意の型である可能性があるため、int、文字列、または特定の型を明示的に返すことはできません。次のような1つのreturn命令を使用してみてください。

public  T ChooseType<T>() 
{
    return (T)this.paramValue;
}

次に、関数を呼び出すときに、次のようにTを指定します。

int a = ChooseType<int>();

また

string a = ChooseType<string>();

paramValueをTとしてキャストできない場合は、エラーがスローされることに注意してください。

于 2012-07-16T12:11:47.053 に答える