Пространство пространства имен Scoped псевдонимы для родовых типов в C #

StackOverflow https://stackoverflow.com/questions/2590643

Вопрос

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

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.ienumableable, 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>>>;

Затем я мог бы также определить пространство имен Scoped псевдоним, например, IDictionary<Y, IList<Z>>.

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

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

Редактировать: я знаю, что я могу использовать using, но это не пространство пространства имен, не так удобно для моего случая.

Редактировать2: см Комментарий Джорен где он предполагает, что структурное набрав может также решить проблему.

Это было полезно?

Решение

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

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

Другие советы

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

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

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

(По общему признанию, это больше работы, чем решение)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top