无法转换为通用类型c#

时间:2015-12-14 13:06:47

标签: c# generics

我有以下情况

public class A
{
}

public class BA : A
{

}

//other subtypes of A are defined

public class AFactory
{
    public T Create<T>() where T : A
    {
        //work to calculate condition
        if (condition)
            return new BA();
        //return other subtype of A
    }
}

抛出以下编译错误:

  

错误CS0029无法隐式转换类型&#39; B&#39;到了&#39;

出了什么问题?

3 个答案:

答案 0 :(得分:8)

施法者很容易失败。假设我有:

public class AB : A {}

B b = new B();
AB ab = b.Create<AB>();

这最终会尝试为B类型的变量分配AB引用。那些是不相容的。

听起来你可能不应该将Create作为通用方法。或者也许你应该A通用:

public abstract class A<T> where T : A
{
    public abstract T Create();
}

public class B : A<B>
{
    public override B Create()
    {
        return new B();
    }
}

这样可行 - 但我们不知道你想要达到的目的,所以它实际上可能对你没有帮助。

或者,你可以保留当前的设计,但请使用:

public T Create<T>() where T :  A
{
    return (T) (object) new B();
}

如果您使用CreateobjectA以外的任何类型参数调用B,那将会失败,这听起来有些奇怪。

答案 1 :(得分:1)

T可以是从A派生的任何类。

也可能有
class C : A { }

它与通用约束匹配,但您无法从B方法返回Create<C>()的实例。

答案 2 :(得分:1)

右。要创建新的B类,您应该使用以下代码:

public class A
{
}

public class B : A
{
    public static T Create<T>() where T : A, new()
    {
        return new T();
    }
}

public class Example
{
    public void DoWork()
    {

        B b = B.Create<B>();
        A a = B.Create<A>();
    }
}