【问题标题】:How to Implicitly Convert an Enumerable of a type with Implicit Conversion Operators in C# 4.0如何在 C# 4.0 中使用隐式转换运算符隐式转换类型的 Enumerable
【发布时间】:2011-02-18 14:33:00
【问题描述】:

给定:

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

但问题在于 int 的可枚举来自不同的来源,例如文件。

如果已经有答案,我很抱歉,但我找不到。

【问题讨论】:

    标签: c#-4.0 ienumerable implicit-conversion


    【解决方案1】:

    根据this answer,你想要的是不可能的。但是你可以通过不隐式转换你的 id 而是你的集合来接近。像这样:

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

    【讨论】:

    • 是的,我也不认为这是可能的,我只是想确定一下。好吧,拥有“Id”类型的全部意义在于使代码更加明确。因此,要删除 int 的使用,而是使用 Id (或类似的)使代码更具可读性。不过,我想您的建议可以与此结合使用。
    【解决方案2】:

    有什么问题:

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

    【讨论】:

    • 没什么,就像我说的那样,我知道你可以这样做。这似乎很愚蠢,因为编译器应该知道从 IEnumerable 到 IEnumerable 的转换是可能的,并且协方差甚至是可行的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多