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