2

メソッド MethodA と MethodB を持つ ClassA と ClassB という 2 つのクラスがあるシナリオがあります。xなどの整数変数の条件に応じて、上記のクラスのオブジェクトインスタンスを返すジェネリックメソッドを作成する必要があります。以下のコードを試すと、「暗黙的に ClassA を T に変換できません」または「ClassB を T に暗黙的に変換できません」というエラーが表示されます。

public ClassA
{
    public void MethodA()
    {
        //method implementation
    }
}

public ClassB
{
    public void MethodB()
    {
        //method implementation
    }
}

としての一般的な方法

public T MethodGeneric<T>()
{
    int x;
    ClassA objectA = new ClassA();
    ClassB objectB = new ClassB();

    if(x==2)
    {
        return objectA;
    }
    else
    {
        return objectB;
    }
}
4

2 に答える 2

4

問題は、そうでTはないというClassAことClassBです。

次のように、キャストを介してこれを処理しようとすることができます。

public static T MethodGeneric<T>() where T : class
{
    int x = 2;
    ClassA objectA = new ClassA();
    ClassB objectB = new ClassB();

    if (x == 2)
    {
        return objectA as T;
    }
    else
    {
        return objectB as T;
    }
}

ただし、誰かが電話をかけた場合、その場合MethodGeneric<ClassC>()に戻る場合を除いて、これはあなたを保護しませんnull.

ClassAエラーの可能性を減らす一般的な制約を配置できるため、ClassB両方が同じ基本クラスまたはインターフェイスから派生している場合、これをより安全にすることができます。ただし、ジェネリックは適切ではないため、これはまだ完全に安全な方法ではありません。両方のクラス (つまり: IClassBase) でインターフェイスを実装し、ジェネリックを使用せずにインターフェイスを返す方がよい場合があります。

public IClassBase CreateInstance()
{
    //... 
         return objectA; // This will work fine, provided ClassA implements IClassBase
}
于 2012-06-05T17:35:35.870 に答える
0

閉鎖されたこの二重投稿から、あなたは近いです。object型引数として渡していますが、これはあなたの場合と同じTものを返しobjectます。ClassAオブジェクトで定義されたプロパティを使用できないのはそのためです。ClassB代わりに、またはのような必要な型を渡す必要がありますClassC。これかもしれません:

public T getObject<T>(int i) where T : ClassA
{
    if(i == 1)
    {
        ClassB objB = new ClassB();
        return objB as T;
    }
    else
    {
        ClassC objC = new ClassC();
        return objC as T;
    }
}

public static void main()
{
    var obj = getObject<ClassB>(5); //which wont work anyway since i == 5 !!
    obj.aValue = 20;
    obj.bValue = 30;
    //obj.cValue = 40; this wont work since obj is of type ClassB

    //or 

    var obj = getObject<ClassC>(5);
    obj.aValue = 20;
    //obj.bValue = 30; this wont work since obj is of type ClassC now
    obj.cValue = 40; 
}

int ivariableをチェックして、返される型を決定する理由がわかりません。それはジェネリックの本当の使い方ではありません。ジェネリックの真の使用は次のようになります。

public T getObject<T>(int i) where T : ClassA
{
    return new T(); //without the use of int i
}

int iどのオブジェクトが返されるかを決定するのであれば、なぜジェネリックを使用するのでしょうか? あなたは非常にうまくいくかもしれません:

public ClassA getObject(int i)
{
    if(i == 1)
    {
        ClassB objB = new ClassB();
        return objB;
    }
    else
    {
        ClassC objC = new ClassC();
        return objC;
    }
}

public static void main()
{
    var obj = getObject(5);
    if (obj is ClassB)
    {
        obj.aValue = 20;
        obj.bValue = 30;
        //obj.cValue = 40; this wont work since obj is of type ClassB
    }
    //or 

    var obj = getObject(5);
    if (obj is ClassC)
    {
        obj.aValue = 20;
        //obj.bValue = 30; this wont work since obj is of type ClassC
        obj.cValue = 40; 
    }
}

ただし、問題は、呼び出し側 (メイン) から型を確認する必要があることです。

また、とオブジェクトの両方に と プロパティbValueを割り当てたい場合は、これらのプロパティを に記述する必要があります。cValueClassBClassCClassA

さらに、アクセサーのみを使用しているため、値を割り当てるget必要もあります。set

于 2012-11-12T07:58:17.687 に答える