1

C# Generics を適切に使用する方法に苦労しています。具体的には、ジェネリック型をパラメーターとして受け取り、ジェネリックの型に基づいてさまざまなことを行うメソッドが必要です。しかし、ジェネリック型を「ダウンキャスト」することはできません。以下の例を参照してください。

コンパイラは、「タイプを(Bar<Foo>)変換できません」というキャストについて不平を言います。しかし、型をチェックしたので、実行時にはキャストは問題ありません。Bar<T>Bar<Foo>

public class Foo { }

public class Bar<T> { }

// wraps a Bar of generic type Foo
public class FooBar<T> where T : Foo
{

    Bar<T> bar;

    public FooBar(Bar<T> bar)
    {
        this.bar = bar;
    }

}

public class Thing
{
    public object getTheRightType<T>(Bar<T> bar)
    {
        if (typeof(T) == typeof(Foo))
        {
            return new FooBar<Foo>( (Bar<Foo>) bar);  // won't compile cast
        }
        else
        {
            return bar;
        }
    }
}
4

2 に答える 2

8

コンパイラは、この場合にBar<T>キャストできることを知ることができません。これは、一般に当てはまらないためです。間にBar<Foo>キャストを導入して「ごまかす」必要があります。object

return new FooBar<Foo>( (Bar<Foo>)(object) bar);
于 2012-10-30T17:57:18.063 に答える
2

これでうまくいくはずで、object最初にキャストする必要はありません。

public class Thing
{
    public object getTheRightType<T>(Bar<T> bar)
    {
        if (typeof(T) == typeof(Foo))
        {
            return new FooBar<Foo>(bar as Bar<Foo>);  // will compile cast
        }
        else
        {
            return bar;
        }
    }
}
于 2012-10-30T18:05:35.163 に答える