我在指定的行中收到错误“ T不包含Id 的定义”,即使在我调试时,我看到“item”确实< / strong>在 基类 中有属性“Id”。
我如何在此指定我希望C#查看项目的Id基类(为什么不自动执行此操作?)?
//public abstract class Items<T> : ItemBase (causes same error)
public abstract class Items<T> where T : ItemBase
{
public List<T> _collection = new List<T>();
public List<T> Collection
{
get
{
return _collection;
}
}
public int GetNextId()
{
int highestId = 0;
foreach (T item in _collection)
{
//ERROR: "T does not contain a definition for Id
if (item.Id > highestId) highestId = item.Id;
}
return highestId;
}
}
以下是如何定义类:
public class SmartForm : Item
{
public string IdCode { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public int LabelWidth { get; set; }
public int FormWidth { get; set; }
...
public abstract class Item : ItemBase
{
public int Id { get; set; }
public DateTime WhenCreated { get; set; }
public string ItemOwner { get; set; }
public string PublishStatus { get; set; }
public int CorrectionOfId { get; set; }
...
答案 0 :(得分:12)
你的问题是T没有约束,因此,在编译时,所有编译器都知道T是某种对象。如果您知道T将始终继承的类型,则可以向类定义添加通用约束:
public abstract class Items<T> : ItemBase where T : Item
{
//....
}
当你调试时,T被实例化为具有Id属性的Item(或子类),但是编译器在编译时不知道,因此错误。
答案 1 :(得分:4)
你的通用约束错了。
public abstract class Items<T> : ItemBase
应该是:
public abstract class Items<T> where T : ItemBase
发生的事情是,当您的课程中有一系列项目时,您的ItemBase
与T
答案 2 :(得分:4)
因为T可能绝对是任何东西,而C#意味着类型安全。对T具有id属性的类型使用约束,你应该没问题。有关详细信息,请参阅here。
答案 3 :(得分:1)
您必须指定T始终使用where子句从ItemBase派生。
答案 4 :(得分:1)
你不小心让Items继承了ItemBase,而不是T继承ItemBase。 只需改变
: ItemBase
到
where T : ItemBase
答案 5 :(得分:-1)
这可能会有所帮助: - )
foreach (ItemBase item in _collection)
{
if (item.Id > highestId) highestId = (Item)item.Id;
}