【问题标题】:C# Generics Constraints: Is there a way to express is not a?C# Generics Constraints:有没有办法表达是不是?
【发布时间】: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&lt;B&gt;' 不能同时实现 'Convertors.IConverter&lt;Microsoft.Crm.Sdk.Lookup,B&gt;' 和 'Convertors.IConverter&lt;Microsoft.Crm.Sdk.Lookup,Microsoft.Crm.Sdk.Moniker&gt;' 因为它们可能会统一为某种类型 范围 换人

有没有办法指定 T 不是业务实体?

【问题讨论】:

  • 您违反了重载规则#1,您不能仅根据返回类型重载方法。这在泛型问题之前很久就失败了。
  • @Ieppie:什么?这与错误消息有什么关系?
  • @Timwi:即使你可以捏造泛型问题,它仍然会由于“损坏”过载而失败。
  • 即使有办法指定T 不是BusinessEntity,您仍然会遇到问题。问题是我可以声明一个LookupConverter&lt;Moniker&gt;,然后必须实现IConverter&lt;Lookup, Moniker&gt; 的两个副本,这会使类的行为不明确。
  • 可以通过显式实现其中一个接口来解决过载问题。如果这是可以接受的,那么这不是问题。

标签: c# .net generics constraints


【解决方案1】:

不,恐怕不会。您拥有的唯一选项在此处列出Constraints on Type Parameters。总之,这些是:

  • 强制值类型
  • 强制引用类型
  • 强制一个非引用类型,它不包含引用类型
  • 强制使用公共无参数构造函数
  • 强制执行特定的基类
  • 强制执行特定接口
  • 强制类型派生自一个参数

【讨论】:

    【解决方案2】:

    不,没有“负面”约束。

    【讨论】:

    • 您将如何解决无法表达解决冲突的问题?
    • @the_drow:很难说不知道为什么要通用转换同一类型和特定类型。
    • 查找是表示数据库中记录的类型/ID元组,将其转换为真实类型涉及访问Web服务并获取序列化为DynamicEntity的xml文件,然后转换将 DynamicEntity(它是一个 BusinessEntity)转换为一个自制的强类型。查找也可以转换为与查找几乎相同但功能较少的名字对象,并且它在系统中的其他地方使用,因此我想轻松转换它。 这不是我的代码,它是 Microsoft Dynamics CRM 糟糕的架构。 只有转换器是我的。
    • @the_drow:哪一点迫使你在同一个类中实现两个接口?
    • @the_drow:不,我不认为这是一个重要的功能——它会增加显着的复杂性,但只有非常罕见的好处,IMO。是的,只需使用单独的课程即可。
    猜你喜欢
    • 2018-11-12
    • 2022-06-16
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多