【问题标题】:Return object that implements interface as said interface返回实现接口的对象作为所述接口
【发布时间】:2019-10-06 18:34:09
【问题描述】:

我试图返回一个实现某个接口的对象作为该接口,但在编译时收到错误CS0030: Cannot convert type 'System.Web.UI.Control' to 'T'

我的代码:

public static T GetAncestorOfType<T>(System.Web.UI.Control control)
{
    var parent = control;
    while (!(parent is T))
    {
        parent = parent.Parent;
        continue;
    }
    return (T)parent;
}

错误与最后一行有关,其中parent 被强制转换为T

也许我需要对方法进行某种类型的约束?

【问题讨论】:

    标签: c# asp.net interface


    【解决方案1】:

    您可以利用约束并避免强制转换。

    public static T GetAncestorOfType<T>(T control) where T : System.Web.UI.Control
    

    这样做,你方法的代码会变成:

    var parent = control;
    while (!(parent is T))
    {
        parent = parent.Parent;
        continue;
    }
    return parent;
    

    【讨论】:

    • 我希望能够使用接口作为类型参数调用此方法。例如,GetAncestorOfType&lt;IControlWithCertainMethod&gt;(page)
    • 如果你想要这个,那么T应该实现IControlWithCertainMethod而不是System.Web.UI.Control。但是,您将遇到另一个问题。可能Parent 不是IControlWithCertainMethod 的成员。如果是这样,那么您的代码将无法编译。
    【解决方案2】:

    如果您使用as 运算符而不是强制转换运算符(并添加类型约束),它可以工作。

    public static T GetAncestorOfType<T>(System.Web.UI.Control control) where T : class
    {
        var parent = control;
        while (!(parent is T))
        {
            parent = parent.Parent;
            continue;
        }
        return parent as T;
    }
    

    Visual Studio 在将强制转换更改为使用 as 后建议使用类型约束。

    我不知道为什么会这样!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2021-09-29
      • 2020-05-09
      相关资源
      最近更新 更多