1

我有这个方法,它将给我第一个父控件,它是通用类型 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

4

1 回答 1

3

在这种情况下,由于curParent被键入为 a Control(from ctrl.Parent),不,编译器不知道如何将 a 转换/转换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检查。

于 2013-04-24T23:08:09.913 回答