隐式转换为IEnumerable <T>

Max*_*ich 2 c# generics ienumerable implicit-conversion c#-4.0

我有一个类用于保存从配置文件加载的值.为了使这个类更容易使用,我已经为一些基本类型设置了许多隐式转换.

我想要转换为的类型之一是IEnumerable(T).例如,如果程序员在配置文件中有这样的值

a = "1,2,3,4"
Run Code Online (Sandbox Code Playgroud)

在C#代码中,他可以写

IEnumerable<int> a = Config.a;
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想写的是这个

    public static implicit operator IEnumerable<T>(ConfigurationValue val)
    {
        string value = val;

        string[] parts = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

        List<T> convertedTypes = new List<T>();

        foreach (string part in parts)
        {
            T converted = Convert.ChangeType(part.Trim(), typeof(T));
            convertedTypes.Add(converted);
        }

        return convertedTypes;
    }
Run Code Online (Sandbox Code Playgroud)

但这给了我语法错误,T未定义.有没有办法定义这样的转换或是否有特殊的语法?

另外,对于记录,我在.Net Framework 4.0中使用C#4.0

Jon*_*eet 8

但这给了我语法错误,T未定义.有没有办法定义这样的转换或是否有特殊的语法?

您正在尝试声明一个泛型运算符 - 这在C#中是不受支持的.(我不知道IL是否支持它.)构造函数,属性,事件和终结器也是如此.

基本上,只有方法和类型可以是通用的.

编辑:如评论中所述,我会写一个通用的方法.用户定义的转换 - 特别是隐含的转换 - 应该非常谨慎地使用,IMO.


Ser*_*kiy 5

您可以创建扩展方法,而不是通用运算符(正如 @Jon 所说,这是不可能的):

public static IEnumerable<T> AsEnumerable<T>(this string value)
{
    if (String.IsNullOrEmpty(value))
        yield break;

    var parts = value.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries);

    foreach (string part in parts)
        yield return Convert.ChangeType(part.Trim(), typeof(T));
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

IEnumerable<int> a = Config.a.AsEnumerable<int>();
Run Code Online (Sandbox Code Playgroud)