littleGreenDude Ответов: 1

C# generics, аргументы типа для метода 'xxxxxxxx' не могут быть выведены из использования.


Вопрос о дженериках C# ,

Я получаю следующую ошибку на стороне вызывающего абонента:

Аргументы типа для метода "xxxxxxxx" не могут быть выведены из использования. Попробуйте явно указать аргументы типа.

Вызывающий абонент:

List<TransferObject> lstTransferObject = new List<TransferObject>();

lstTransferObject = GetDtoList(a, b);


Ошибка связана с методом GetDtoList, я попытался указать вызов как. GetDtoList ((string) a, (byte []) b), но это не сработало, поэтому я неправильно интерпретирую сообщение об ошибке. Источник GetDtoList выглядит следующим образом:

public static List<T> GetDtoList<T>(string k, byte[] s)
{
    List<T> lst = new List<T>();
    foreach(Code_dto dto in Code_GetList())
    {
        dynamic item = new { Name = "code", Data = dto.GetCodeString(k, s) };
        lst.Add(item);
    }

    return lst;
}



В ответ на вопрос ниже... ничего интересного, он просто возвращает список. Выглядит примерно так:
private static List<Code_dto> Code_GetList()
{
	List<Code_dto> lstCodeDto = new List<Code_dto>();
	
	// Grab records from the db and add to the list
	
	return lstCodeDto;
}


Что я уже пробовал:

1) Запуск проблемы другим товарищем по команде
2) исследовал аналогичные проблемы стека и CP (большинство из них, похоже, основаны на MVC).

David_Wimbley

Можете ли вы предоставить код для Code_GetList (). Идея заключается в том, что здесь вы хотите предоставить весь код, который можете, чтобы кто-то воспроизвел вашу проблему, чтобы предоставить вам наилучшую возможную помощь. На данный момент я не вижу, как кто-то может помочь, поскольку мы не знаем, что делает/делает Code_GetList ().

[no name]

Что такое "А"и " Б"? Сколько у вас есть методов GetDtoList?

littleGreenDude

Только один GetDtoList

[no name]

Ну, поскольку вы не предоставили SCCE, который демонстрирует проблему, я предполагаю, что список, возвращаемый Code_GetList, не содержит ожидаемого типа данных TransferObject. Если только у вас нет какого-то скрытого кода, который преобразует Code_dtos в TransferObjects....

littleGreenDude

a-это строка, А b-массив байтов

1 Ответов

Рейтинг:
11

Richard Deeming

Аргумент типа для параметра универсального типа может быть выведен только в том случае, если он используется во входном параметре. Во всех остальных случаях параметр type должен быть объявлен явно.

Параметр type может быть выведен для всех этих параметров:

public static T Foo<T>(T bar) { ... }
int x = Foo(42);

public static T FirstOrDefault<T>(IEnumerable<T> source) { ... }
string item = FirstOrDefault(myListOfStrings);

public static IEnumerable<T> Where<T>(IEnumerable<T> source, Func<T, bool> predicate) { ... }
IEnumerable<Bar> filteredList = Where(myListOfBars, bar => someCondition);


Но если ни один из входных параметров не связан с параметром type, вы должны указать параметр type явно:
public static List<T> MakeAList<T>(int x, string y) { ... }

List<Bar> myList = MakeAList(42, "Hello"); // Compiler error
List<Bar> myList = MakeAList<Bar>(42, "Hello"); // OK


Итак, в вашем примере вам нужно:
lstTransferObject = GetDtoList<TransferObject>(a, b);


ОДНАКО, этот не будет работать Ваш код будет компилироваться, но вы получите исключение во время выполнения, потому что вы пытаетесь добавить объект одного типа в список другого типа. Если вы замените dynamic ключевая работа с любым из них object или T, вы получите ошибку компилятора, которая покажет вам, в чем проблема.

Если вы хотите вернуть список dynamic объекты, то ваш метод должен вернуть List<dynamic>. Если вы хотите вернуть список определенного типа, то вам нужно создать экземпляр этого конкретного типа в вашем цикле.


Maciej Los

Звучит очень разумно, А5!