我有以下情况
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;
出了什么问题?
答案 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();
}
如果您使用Create
,object
或A
以外的任何类型参数调用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>();
}
}