Вывод типа C # универсального параметра типа метода, где метод не имеет аргументов - PullRequest
7 голосов
/ 28 января 2009

Учитывая следующий универсальный интерфейс и реализующий класс:

public interface IRepository<T> {
    // U has to be of type T of a subtype of T
    IQueryable<U> Find<U>() where U : T;
}

public class PersonRepository : IRepository<Employee> {

}

Как я могу вызвать метод Find без указания U?

var repository = new EmployeeRepository();
// Can't be done
IQueryable<Employee> people = repository.Find();

// Has to be, but isn't Employee a given in this context?
IQueryable<Employee> people = repository.Find<Employee>();

// Here I'm being specific
IQueryable<Manager> managers = repository.Find<Manager>();

Другими словами, что можно сделать, чтобы получить вывод типа?

Спасибо!

Ответы [ 2 ]

15 голосов
/ 28 января 2009

Как я могу вызвать метод Find без указания U?

Ты не можешь.

К сожалению, разрешение перегрузки общего метода C # не совпадает на основе возвращаемых значений.

См. Сообщение Эрика Липперта в блоге об этом: C # 3.0 Вывод типа возврата не работает для групп методов

Но один простой способ написать это - использовать ключевое слово var.

var employees = repository.Find<Employee>();
6 голосов
/ 28 января 2009

Как насчет письма

var people = repository.Find<Employee>();

Это сохраняет то же количество печатания, но другим способом.

...