C#中MinHeap类访问Uccellino的number属性报错的解决方法
解决“‘Uccellino’不包含‘number’的定义”错误
错误原因
你写的MinHeap<Uccellino>是泛型类定义,这里的Uccellino是一个泛型类型参数,会覆盖你自己定义的Uccellino类。编译器此时把它当作一个未知的、没有任何成员的类型,自然找不到number属性。
方案一:移除泛型,让MinHeap只存储Uccellino
如果你的堆只需要处理Uccellino类型,直接去掉泛型参数即可:
修改后的MinHeap类:
public class MinHeap { Uccellino[] heap; int capacity; int occupied; // 补充构造函数初始化堆数组 public MinHeap(int capacity) { this.capacity = capacity; heap = new Uccellino[capacity]; occupied = 0; } public Uccellino Parent(int index) { return heap[(index - 1) / 2]; } public void Inserisci(Uccellino u) { heap[occupied] = u; int i = occupied; occupied++; // 无需强制类型转换,直接访问number属性 while (i != 0 && Parent(i).number > heap[i].number) { Uccellino temp = heap[i]; heap[i] = Parent(i); heap[(i - 1) / 2] = temp; i = (i - 1) / 2; } } }
方案二:保留泛型,添加类型约束(支持多种可比较类型)
如果想让MinHeap支持更多类型,需要给泛型参数添加约束,确保它包含number属性:
- 先定义一个包含
number属性的接口:
public interface INumbered { int number { get; } }
- 让
Uccellino实现这个接口:
public class Uccellino : INumbered { public int id { get; } public int number { get; } public Uccellino(int identifier, int num) { this.id = identifier; this.number = num; } }
- 修改MinHeap的泛型定义,添加约束:
public class MinHeap<T> where T : INumbered { T[] heap; int capacity; int occupied; public MinHeap(int capacity) { this.capacity = capacity; heap = new T[capacity]; occupied = 0; } public T Parent(int index) { return heap[(index - 1) / 2]; } public void Inserisci(T u) { heap[occupied] = u; int i = occupied; occupied++; while (i != 0 && Parent(i).number > heap[i].number) { T temp = heap[i]; heap[i] = Parent(i); heap[(i - 1) / 2] = temp; i = (i - 1) / 2; } } }
内容的提问来源于stack exchange,提问作者leocontext
相关产品推荐
相关产品推荐

