【发布时间】:2010-10-18 13:14:48
【问题描述】:
我有以下代码:
interface IConverter<T, U>
{
U Convert(T obj);
}
interface IBusinessEntityConveter<T, U> : IConverter<T, U>
where U : BusinessEntity
{
}
class LookupConveter<B> : IBusinessEntityConveter<Lookup, B>, IConverter<Lookup, Moniker>
where B : BusinessEntity, new()
{
#region IConverter<Lookup, Moniker> Members
public Moniker Convert(Lookup obj)
{
//...
}
#endregion
#region IConverter<Lookup,B> Members
public B Convert(Lookup obj)
{
//...
}
#endregion
}
我收到此错误:
错误 2 '
Convertors.LookupConveter<B>' 不能同时实现 'Convertors.IConverter<Microsoft.Crm.Sdk.Lookup,B>' 和 'Convertors.IConverter<Microsoft.Crm.Sdk.Lookup,Microsoft.Crm.Sdk.Moniker>' 因为它们可能会统一为某种类型 范围 换人
有没有办法指定 T 不是业务实体?
【问题讨论】:
-
您违反了重载规则#1,您不能仅根据返回类型重载方法。这在泛型问题之前很久就失败了。
-
@Ieppie:什么?这与错误消息有什么关系?
-
@Timwi:即使你可以捏造泛型问题,它仍然会由于“损坏”过载而失败。
-
即使有办法指定
T不是BusinessEntity,您仍然会遇到问题。问题是我可以声明一个LookupConverter<Moniker>,然后必须实现IConverter<Lookup, Moniker>的两个副本,这会使类的行为不明确。 -
可以通过显式实现其中一个接口来解决过载问题。如果这是可以接受的,那么这不是问题。
标签: c# .net generics constraints