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);
}
}
答案 0 :(得分:1)
您无法编写通用方法来执行此操作。显式转换操作需要在编译时绑定,但是当编译该方法时,它不知道源和目标类型是什么,因此它可能不会绑定到您的自定义转换运算符。
答案 1 :(得分:0)
c#不如c ++那么灵活
C ++允许对模板中的所有类型参数可能无效的代码,然后检查用作类型参数的特定类型。 C#要求类中的代码以这样的方式编写,即它将适用于满足约束的任何类型。例如,在C ++中,可以在类型参数的对象上编写一个使用算术运算符+和 - 的函数,这将在使用不支持这些运算符的类型实例化模板时产生错误。 C#不允许这样做;允许的唯一语言结构是那些可以从约束中推导出来的结构。