Ошибка при возвращении универсального типа (без неявного преобразования) - PullRequest
0 голосов
/ 31 января 2019

Получение исключения неявного преобразования при вызове универсального метода.Как правильно это сделать?

Вот мои определения интерфейса и класса:

public interface TestData
{
    string field { get; set; }
    string fieldName { get; set; }
    string type { get; set; }
}

public class TestClass
{
    public static T Call<T>(string Project, string type) where T : TestData
    {
        var returning = GETCG<T>(test, type);

        return (T)Convert.ChangeType(returning, typeof(T), CultureInfo.InvariantCulture);
    }

    private static T GETCG<T>(string test, string type) where T : TestData
    {
        var fields = nodees.Cast<XmlNode>().Select(x => new
        {
            // some data
        }).ToList();

        if (fields != null)
        {
            return (T) Convert.ChangeType(templateFields, typeof(T), 
                CultureInfo.InvariantCulture);
        }
        else
        {
            return (T)Convert.ChangeType("SomeString", typeof(T), 
                CultureInfo.InvariantCulture);
        }
    }
}

Я получаю следующее исключение:

Тип 'System.Collections.Generic.List«нельзя использовать в качестве параметра типа« T »в универсальном типе или методе« TestClass.Call (string, string) ».Не существует неявного преобразования ссылок из 'System.Collections.Generic.List' в 'Test.TestData'

В строке кода ниже:

var test = TestClass.Call<List<TestData>>("ProjName", "Audio");

Если вы видитев методе GETCG я возвращаю различные типы List и string.Методы Call и GETCG реализуют интерфейс TestData.Могу ли я объяснить, почему я получаю эту ошибку, и как я могу улучшить этот код, помня, что мне нужно вернуть strings и List из TestClass

1 Ответ

0 голосов
/ 31 января 2019

Проблема в том, что вы определили ограничение для T, что он должен реализовывать интерфейс TestData, однако вы объявляете T как List<TestData>.

Компиляторговорит вам, что List<T> не реализует интерфейс TestData и не существует неявного преобразования, которое он может использовать, чтобы это произошло.

Решением будет либо удалить ограничение, либо передать экземпляр классакоторый реализует интерфейс TestData.

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