Пространство имен определило объем псевдонимов для универсальных типов в C#

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

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, int, IDictionary>>.

Было бы замечательно, если я мог бы создать ограниченные по объему псевдонимы типа пространства имен типа для универсальных типов в C#. Затем я определил бы Bar не как делегат, а скорее я определил бы его, поскольку пространство имен определило объем псевдонима для Func, int, IDictionary>>.

public alias Bar = Func, int, IDictionary>>;

Я мог затем также определить ограниченный по объему псевдоним пространства имен для, например. IDictionary>.

И, если используется соответственно:), это сделает код более читаемым. Теперь, я должен встроить универсальные типы, и реальный код не хорошо читаем: (

Сделайте, чтобы Вы нашли ту же проблему:)? Есть ли какое-либо серьезное основание, почему это не находится в C# 3.0? Или нет никакого серьезного основания, это - просто вопрос денег и/или время?

Править: Я знаю, что могу использовать using, но это не ограниченное по объему пространство имен - не настолько удобный для моего случая.

EDIT2: См. комментарий Joren, где он предполагает, что структурный ввод мог бы также решить проблему.

7
задан Community 23 May 2017 в 12:23
поделиться

2 ответа

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

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

9
ответ дан 7 December 2019 в 03:13
поделиться

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

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

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

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

0
ответ дан 7 December 2019 в 03:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: