我有这个方法,它会给我第一个父控件,它是泛型类型T,其中T是Control的子类型。
// Given a Control, find parent Control of T
public static T FindParent<T>(this Control ctrl) where T : Control
{
var curParent = ctrl.Parent;
while (curParent != null && !(curParent is T))
{
curParent = curParent.Parent;
}
return (T)curParent;
}
然而,现在,我想找到一个实现接口T的父控件。当我从方法中删除where T : Control
子句时,return (T)curParent
行会出现编译错误Cannot convert type 'System.Web.UI.Control' to T
答案 0 :(得分:3)
在这种情况下,因为curParent
被输入Control
(来自ctrl.Parent
),不,编译器不知道如何转换/转换Control
到某个任意泛型类型T
。但是,由于您在运行时知道该类型是兼容的,因此您可以通过首先转换为object
来轻松解决它:
public static T FindParent<T>(this Control ctrl)
{
var curParent = ctrl.Parent;
while (curParent != null && !(curParent is T))
{
curParent = curParent.Parent;
}
return (T)(object)curParent;
}
在这种情况下,编译器不能抱怨,它只需要相信你知道你在运行时正在做什么,在这种情况下我们会因为curParent is T
检查而这样做。