【发布时间】:2018-09-05 07:48:02
【问题描述】:
我想用其中一个子类填充一个通用属性。但我得到这个错误:
无法将类型“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; }
}
同时考虑这个示例泛型类:
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();
}
}
更多解释:
我的错误是我试图在泛型类中初始化子类。按照接受的答案,我应该添加新约束并执行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();
}
}
【问题讨论】:
-
你的意思是
where T : parent, new()和ChildObject = new T();吗? -
new Child1() as T,但是如果 T 是 Child2,那么 ChildObject 变为 null
-
@vc-74 +1 你这么快就指出了解决方案。真是令人惊叹的新约束。 docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
标签: c# generics inheritance initialization