开发者

How to Implicitly Convert an Enumerable of a type with Implicit Conversion Operators in C# 4.0

Given:

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); }
}

Can you implicitly convert an

IEnumerable<int>

to

IEnumerable<Id>

and vice versa. In some way. Note that

var ids 开发者_运维技巧= new int[]{ 1, 2 };
ids.Cast<Id>();

does not appear to work and covariance does not appear to be working in this case, either. Of course, doing a select will work i.e.:

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

But I am looking for something that would make this work implicitly, so writing:

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

And yes, I know this can be written as:

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

But the issue is in cases where the enumerable of ints comes from a different source, such as a file for example.

I am sorry if there already is an answer for this, but I could not find it.


According to this answer what you want is not possible. But you can get close by not implicitly casting your id but your collection. Like this :

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

then this is possible :

Ids t = new [] { 3,4 };


What's wrong with:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜