c#generic中的显式强制转换

时间:2018-01-24 22:28:48

标签: c# generics casting

CastRangeAndAdd的非泛型版本可以正常工作。如果我跳过(对象)

var castedList = list.Select(e => (NewType)e).ToList();

然后出现编译错误。如果我使用(对象)然后有一个异常“类型TypeHintExcel不能转换为TypeHint”,虽然转换运算符在那里。任何的想法? (TypeHint和TypeHintExcel不相关,因此我理解不能使用“as keyword”。)

    public static explicit operator TypeHint(TypeHintExcel p)
    {
        var result = new TypeHint()
        {
            Id = p.Id,
            Hint = p.Hint,
            ExternalType = p.ExternalType,
            AlienType = p.AlienType,
            Weight = p.Weight
        };
        return result;
    }

public static class DbSetExtensions
{
    public static void CastRangeAndAdd<OldType, NewType>
(this System.Data.Entity.DbSet<NewType> dbCollection, 
        List<OldType> list)
        where NewType : class
    {
        var castedList = list.Select(e => (NewType)(object)e).ToList();
        dbCollection.AddRange(castedList);
    }
}

2 个答案:

答案 0 :(得分:1)

您无法编写通用方法来执行此操作。显式转换操作需要在编译时绑定,但是当编译该方法时,它不知道源和目标类型是什么,因此它可能不会绑定到您的自定义转换运算符。

答案 1 :(得分:0)

c#不如c ++那么灵活

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/differences-between-cpp-templates-and-csharp-generics

C ++允许对模板中的所有类型参数可能无效的代码,然后检查用作类型参数的特定类型。 C#要求类中的代码以这样的方式编写,即它将适用于满足约束的任何类型。例如,在C ++中,可以在类型参数的对象上编写一个使用算术运算符+和 - 的函数,这将在使用不支持这些运算符的类型实例化模板时产生错误。 C#不允许这样做;允许的唯一语言结构是那些可以从约束中推导出来的结构。