Can';t转换为泛型c#

Can';t转换为泛型c#,c#,generics,C#,Generics,我有下面的场景 公共A类 { } 公开课BA:A { } //定义了一个类的其他子类型 公营工厂 { public T Create(),其中T:A { //计算条件的工作 如果(条件) 返回新的BA(); //返回文件的其他子类型 } } 将引发以下编译错误: 错误CS0029无法将类型“B”隐式转换为“T” 怎么了 嗯,演员阵容很容易失败。假设我有: public class AB : A {} B b = new B(); AB ab = b.Create<AB>();

我有下面的场景

公共A类
{
}
公开课BA:A
{
}
//定义了一个类的其他子类型
公营工厂
{
public T Create(),其中T:A
{
//计算条件的工作
如果(条件)
返回新的BA();
//返回文件的其他子类型
}
}
将引发以下编译错误:

错误CS0029无法将类型“B”隐式转换为“T”


怎么了

嗯,演员阵容很容易失败。假设我有:

public class AB : A {}

B b = new B();
AB ab = b.Create<AB>();
这会起作用,但我们不知道你想要实现什么,所以它可能实际上对你没有帮助

或者,您可以保留当前设计,但使用:

public T Create<T>() where T :  A
{
    return (T) (object) new B();
}
public T Create(),其中T:A
{
返回(T)(对象)新的B();
}

如果使用类型参数不是
object
a
B
,调用
Create
,则该操作将失败,这听起来有点奇怪…

T
可以是从
a
派生的任何类。也可能有一个

class C : A { }

它与泛型约束匹配,但不能从
Create()
方法返回
B
的实例。

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

公共A类
{
}
B级:A级
{
公共静态T Create(),其中T:A,new()
{
返回新的T();
}
}
公开课范例
{
公共工作
{
B=B.Create();
A=B.Create();
}
}

您想要实现什么目标?为什么要这样做?
B
T
都是
A
的子类型,但这并不意味着
B
T
是相同的……看起来你在这方面变化很大,很难找到这个问题的答案;你能用其他人提供的修改来修复格式和标签吗?我想你的意思是
public class B:A
而不是
public class B:T
class C : A { }
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>();
    }
}