Псевдонимы пространства имен для универсальных типов в C # - PullRequest
7 голосов
/ 07 апреля 2010

Давайте рассмотрим следующий пример:

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: см. комментарий Джорена , где он предполагает, что структурная типизация может также решить проблему.

Ответы [ 2 ]

9 голосов
/ 07 апреля 2010

Тебе не повезло; Директива using влияет только на текущий файл. Не существует механизма псевдонимов в пространстве имен.

Это довольно часто запрашиваемая функция, которая указывает на это. Но это также удобная функция «приятно иметь», в отличие от той, которая действительно добавляет много репрезентативной силы в язык, что указывает на это. Это было бы неплохо, но в списке приоритетов это не очень важно.

0 голосов
/ 07 апреля 2010

Если вы делаете ...

var results = source.Select((x, i) => foo.Bar(x, i));

может определить типы для вас, не указывая их явно.

(правда, это скорее обходной путь, чем решение)

...