Давайте иметь следующий пример:
public class X { }
public class Y { }
public class Z { }
public delegate IDictionary> Bar(IList x, int i);
public interface IFoo
{
// ...
Bar Bar { get; }
}
public class Foo : IFoo
{
// ...
public Bar Bar
{
get
{
return null; //...
}
}
}
void Main()
{
IFoo foo; //= ...
IEnumerable> source; //= ...
var results = source.Select(foo.Bar); // <- compile error here
}
В компиляторе говорится:
Аргументы типа для метода 'Система. Linq. Счетный. Выберите (Система. Наборы. Универсальный. IEnumerable, Система. Func)', не может быть выведен из использования. Попытайтесь указать аргументы типа явно.
Это - потому что, это не может преобразовать Bar
кому: Func
.
Было бы замечательно, если я мог бы создать ограниченные по объему псевдонимы типа пространства имен типа для универсальных типов в C#. Затем я определил бы Bar
не как делегат, а скорее я определил бы его, поскольку пространство имен определило объем псевдонима для Func
.
public alias Bar = Func, int, IDictionary>>;
Я мог затем также определить ограниченный по объему псевдоним пространства имен для, например. IDictionary
.
И, если используется соответственно:), это сделает код более читаемым. Теперь, я должен встроить универсальные типы, и реальный код не хорошо читаем: (
Сделайте, чтобы Вы нашли ту же проблему:)? Есть ли какое-либо серьезное основание, почему это не находится в C# 3.0? Или нет никакого серьезного основания, это - просто вопрос денег и/или время?
Править: Я знаю, что могу использовать using
, но это не ограниченное по объему пространство имен - не настолько удобный для моего случая.
EDIT2: См. комментарий Joren, где он предполагает, что структурный ввод мог бы также решить проблему.
Вам не повезло; директива using влияет только на текущий файл. Не существует механизма псевдонимов типов для всего пространства имен.
Это довольно часто запрашиваемая функция, есть баллы за нее. Но это также удобная функция «приятно иметь», в отличие от той, которая действительно добавляет много репрезентативной мощности языку, что является противным. Было бы неплохо сделать, но это не так уж важно в списке приоритетов.
Если вы это сделаете ...
var results = source.Select((x, i) => foo.Bar(x, i));
, он сможет определить типы для вас без необходимости указывать их явно.
(По общему признанию, это скорее обходной путь, чем решение)