1

我正在为如何正确使用 C# 泛型而苦苦挣扎。具体来说,我希望有一个将泛型类型作为参数并根据泛型类型执行不同操作的方法。但是,我不能“向下转换”通用类型。请参见下面的示例。

编译器抱怨演员(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 回答