首页 > 解决方案 > C#:如何表达可以从字符串转换类型的约束?

问题描述

我有以下(工作)代码:

List<string> stringList = new List<string> { "foo", "bar" };
var ret = stringList.ConvertAll(item => (MyString)item);

这很好用,因为我提供了一个显式转换运算符:

public struct MyString
{
    private readonly string _myString;
    public MyString(string myString)
    {
        _myString = myString;
    }
    [...]
    public static explicit operator MyString(string myString)
    {
        return new MyString(myString);
    }
}

现在我的问题是我无法在以下代码中将其表达为约束:

public List<T> conv<T>(List<string> stringList)
{
    var ret = stringList.ConvertAll(item => (T)item); // <-- CS0030: Cannot convert type 'string' to 'T'
    return ret;
}

where我在这里缺少什么约束咒语?


更新:

ConvertAll根据以下SO帖子专门使用:

作为旁注,我使用以下方法得到完全相同的错误:

public List<T> conv<T>(List<string> stringList)
{
    var ret = stringList.Select(x => (T)x).ToList();
    return ret;
}

标签: c#generics

解决方案


根据@Charliefact 的建议,我实现了以下内容:

public List<T> conv<T>(List<string> stringList, Func<string,T> castFromStringConstraint)
{
    var ret = stringList.ConvertAll(item => castFromStringConstraint(item));
    return ret;
}

推荐阅读