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>();
}
}