Как неявно преобразовать Enumerable типа с операторами неявного преобразования в C # 4.0 - PullRequest
1 голос
/ 18 февраля 2011

Дано:

public struct Id
{
    readonly int m_id;

    public Id(int id)
    { m_id = id; }

    public static implicit operator int(Id id)
    { return id.m_id; }

    public static implicit operator Id(int id)
    { return new Id(id); }
}

Можете ли вы неявно конвертировать

IEnumerable<int>

до

IEnumerable<Id>

и наоборот. Каким-то образом. Обратите внимание, что

var ids = new int[]{ 1, 2 };
ids.Cast<Id>();

не работает, и ковариация в этом случае также не работает. Конечно, выбор будет работать, т. Е .:

ids.Select(id => new Id(id));

Но я ищу что-то, что сделало бы эту работу неявно, поэтому пишу:

IEnumerable<Id> ids = new int[]{ 1, 2 };

И да, я знаю, это можно записать как:

IEnumerable<Id> ids = new Id[]{ 1, 2 };

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

Извините, если для этого уже есть ответ, но я не смог его найти.

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Согласно этот ответ то, что вы хотите, невозможно. Но вы можете приблизиться, неявно передавая свой идентификатор, а свою коллекцию. Как это:

public class Ids : List<int>
{
    public static implicit operator Ids(int[] intArray)
    {
        var result = new Ids();
        result.AddRange(intArray);
        return result;
    }
}

тогда это возможно:

Ids t = new [] { 3,4 };
0 голосов
/ 18 февраля 2011

Что не так с:

IEnumerable<int> data = GetDataFromSource();
IEnumerable<Id> ids = data.select(id => new Id(id));
...