关于C#泛型类的使用

能帮忙看下面的代码为啥会报错?谢谢啦。namespaceSC{classSequentialQueue<T>{....../*对象成员*///队列内容T[]content... 能帮忙看下面的代码为啥会报错?谢谢啦。

namespace SC
{
class SequentialQueue<T>
{
......
/* 对象成员 */
//队列内容
T[] content;
//队列“指针”
Int32 front; //头“指针”
Int32 rear; //尾“指针”
......
//查找elem元素,返回元素位置到location
public void searchElem(ref Int32 location, T elem)
{
Int32 p;
location = 0;
int counter;
for (p = front, counter = 1; counter <= sizeUsed; counter++)
{
if (content[p] == elem)
//这里报错:运算符“==”无法应用于“T”和“T”类型的操作数
//Tips: content已经申请过空间,不是null
{
location = counter;
break;
}
p = (p + 1) % sizeAll;
}
}
......
}
}
展开
 我来答
乀柠檬最萌
2015-11-09 · TA获得超过1.6万个赞
知道大有可为答主
回答量:4550
采纳率:95%
帮助的人:457万
展开全部
泛型类封装不是特定于具体数据类型的操作。 泛型类最常用于集合,如链接列表、哈希表、堆栈、队列、树等。 像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关。对大多集合类的操作,推荐使用 .NET Framework 类库中所提供的类。
(1)泛型类可以继承具体类、封闭式构造、开放式构造基类。
代码如下:
class BaseNode { }
class BaseNodeGeneric<T> { }
// 继承具体类
class NodeConcrete<T> : BaseNode { }
//继承封闭式构造基类
//封闭式构造基类指基类类型参数指定具体类型
class NodeClosed<T> : BaseNodeGeneric<int> { }
//继承开放式构造基类
//开放式构造基类指基类类型参数未指定
class NodeOpen<T> : BaseNodeGeneric<T> { }
(2)基类类型参数必须在子类中指定实现。
代码如下:
//正确
class Node1 : BaseNodeGeneric<int> { }
//错误
//在子类中未指定父类类型参数实现
class Node2 : BaseNodeGeneric<T> {}
//错误
//在子类中未指定父类类型参数实现
class Node3 : T {}
class BaseNodeMultiple<T, U> { }
//正确
class Node4<T> : BaseNodeMultiple<T, int> { }
//正确
class Node5<T, U> : BaseNodeMultiple<T, U> { }
//错误
//在子类中未指定父类类型参数实现
class Node6<T> : BaseNodeMultiple<T, U> {}
(3)从开放式构造类型继承的泛型类必须指定约束,这些约束是基类型约束的超集或暗示基类型约束。
代码如下:
class NodeItem<T> where T : System.IComparable<T>, new() { }
class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { }
(4)泛型类型可以使用多个类型参数和约束。
代码如下:
class SuperKeyType<K, V, U>
where U : System.IComparable<U>
where V : new()
{ }
(5)开放式构造类型和封闭式构造类型可以用作方法参数。
代码如下:
void Swap<T>(List<T> list1, List<T> list2)
{ }
void Swap(List<int> list1, List<int> list2)
{ }
freeeeeewind
推荐于2017-10-03 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1363万
展开全部
    class SequentialQueue<T>
    {
        //......
        /*      对象成员      */
        //队列内容
        T[] content;
        //队列“指针”
        Int32 front;            //头“指针”
        Int32 rear;             //尾“指针”
        Int32 sizeUsed, sizeAll;
        //......
        //查找elem元素,返回元素位置到location
        public void searchElem(ref Int32 location, T elem)
        {
            Int32 p;
            location = 0;
            int counter;
            for (p = front, counter = 1; counter <= sizeUsed; counter++)
            {
                if (AreEqual(elem, content[p]))
                {
                    location = counter;
                    break;
                }
                p = (p + 1) % sizeAll;
            }
        }
        
        public bool AreEqual<T>(T p1, T p2)
        {
            return EqualityComparer<T>.Default.Equals(p1, p2);
        }
    }
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liuxilink
2014-07-16 · TA获得超过132个赞
知道小有建树答主
回答量:224
采纳率:0%
帮助的人:226万
展开全部
写成这样就行了
(object)content[p] == (object)elem
更多追问追答
追问
可以解释一下为什么吗?谢谢啦!
追答
我也不太确定    我的理解是   你的T类型如果不是object类型的就可能没有==运算符
所以强转以后确保它可以执行==
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式