通用约束和类型参数混乱

时间:2010-12-31 08:46:03

标签: c# .net generics

我将以下基本抽象类定义为:

public abstract class BaseObject<T> : IComparable, IComparable<T>, IEquatable<T> {}

我还有一个定义为的接口:

public interface ICode<T> where T : struct
{
    T Code { get; }
}

现在我想派生一个继承自BaseObject<T>的类,并包含接口ICode<T>

我试着像那样定义:

public class DerivedObject<T, U> : BaseObject<T>, ICode<U> where T : DerivedObject<T, U> where U : struct
{

    public DerivedObject(U code)
    {
        Code = code;
    }

    // From BaseObject
    protected override int InstanceCompareTo(T obj)
    {
        return Code.CompareTo(obj.Code);
    }

    // From BaseObject
    protected override bool InstanceEquals(T obj)
    {
        return Code.Equals(obj.Code);
    }

    // From ICode
    U _Code;

    public U Code 
    { 
        get { return _Code; }
        protected set { _Code = value; }
    }
}

来自编译器的唯一错误是Code.CompareTo(obj.Code)带有消息:

'U'不包含'CompareTo'的定义,也没有扩展方法'CompareTo'接受类型'U'的第一个参数。

U是值类型,应该知道CompareTo

你知道我做错了什么,或者我做错了什么?

我的最终目标是推导出这样的课程:

    public class Account : DerivedObject<Account, int>
    public class ItemGroup : DerivedObject<ItemGroup, string>

非常感谢提前!

2 个答案:

答案 0 :(得分:2)

  

但是U是值类型,应该知道   的CompareTo。

啊 - 不。 Jusst因为U是一个值类型并不意味着它必须有COmpareTo,并且&#34;应该知道&#34;你说的是什么,但没有提到你的班级定义。

要求U也实现IComparable和&#34;应该知道&#34;是编译器可以理解的东西。 CompareTo不是struct的属性,但因为所有主要结构都实现了IComparable。

答案 1 :(得分:2)

struct类型没有必要使用CompareTo方法。您必须使用约束来强制执行它:

public class DerivedObject<T, U> : BaseObject<T>, ICode<U>
    where T : DerivedObject<T, U>
    where U : struct, IComparable<U> {}

CompareTo方法是IComparable<T>合同的一部分。它与U作为值类型无关。这就是为什么你必须添加一个通用约束,表明UIComparable<U>