Возвратите объект, который реализует интерфейс как упомянутый интерфейс - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь вернуть объект, который реализует определенный интерфейс в качестве этого интерфейса, но получает ошибку 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.

Возможно, мне нужно какое-то ограничение типа для метода?

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Вы можете использовать ограничение и избежать приведения.

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;
0 голосов
/ 04 октября 2019

Если вы используете оператор 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.

Я не знаю, почему это работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...