sor*_*usi 2 c# generics inheritance initialization
我想用其中一个子类填充通用属性。但我收到此错误:
无法将类型“Child1”隐式转换为“T”
我该怎么做?
例如:
考虑这些父类和子类:
public abstract class Parent
{
public int P1 { get; set; }
public abstract int DoSomething();
}
public class Child1 : Parent
{
public override int DoSomething() { return P1 * 2; }
}
public class Child2 : Parent
{
public override int DoSomething() { return P1 * 3; }
}
Run Code Online (Sandbox Code Playgroud)
还要考虑这个示例通用类:
public class Sample<T> where T: Parent
{
T ChildObject { get; set; }
public int Test()
{
ChildObject = new Child1 { P1 = 2 }; // Error: Cannot implicitly convert type 'Child1' to 'T'
return ChildObject.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
更多解释:
我的错误是我试图在泛型类中初始化子类。按照接受的答案,我应该添加新的约束并执行ChildObject = new T { P1 = 2 };
然后使用ChildObject.DoSomething();
.
解决方案:
public class Sample<T> where T: Parent, new()
{
T ChildObject { get; set; }
public int Test()
{
ChildObject = new T { P1 = 2 }; // Fixed :)
return ChildObject.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
将您的Sample
课程更改为:
public class Sample<T> where T : Parent, new()
{
T ChildObject { set; get; }
public Sample()
{
ChildObject = new T();
}
}
Run Code Online (Sandbox Code Playgroud)
您现在可以创建一个实例:
var sample = new Sample<Child2>();
Run Code Online (Sandbox Code Playgroud)
为了使其工作,Child1
并且Child2
需要有一个公共无参数构造函数。这是记录在这里
这是一个更具说明性的示例:
class Tiger : Mammal {}
class Zebra : Mammal {}
public class Sample<TAnimal> where TAnimal: Mammal
{
TAnimal ChildObject { set; get; }
void Test()
{
ChildObject = new Tiger(); // Error: Cannot implicitly convert type 'Tiger' to 'TAnimal'
}
}
Run Code Online (Sandbox Code Playgroud)
比方说,我们使用Zebra
了TAnimal
。它会给我们:
public class Sample<Zebra> where Zebra: Mammal
{
Zebra ChildObject { set; get; }
void Test()
{
ChildObject = new Tiger(); // Bang!
}
}
Run Code Online (Sandbox Code Playgroud)
这两个Zebra
和Tiger
是哺乳动物,但它并不意味着斑马是老虎因此错误。