創建一個帶有Name屬性的項目的簡單列表(UniqueList),該屬性只能包含唯一項目(定義爲具有不同的名稱)。在UniqueList類型的約束可以是一個接口:類型參數的約束:接口與抽象類
interface INamed
{
string Name { get;}
}
或抽象類:
public abstract class NamedItem
{
public abstract string Name { get; }
}
所以UniqueList可以是:
class UniqueList<T> : List<T> where T : INamed
或
class UniqueList<T> : List<T> where T : NamedItem
類函數AddUni闕:
public T AddUnique(T item)
{
T result = Find(x => x.Name == item.Name);
if (result == default(T))
{
Add(item);
return item;
}
return result;
}
如果類類型約束是基於接口上,編譯結果
Error: Operator '==' cannot be applied to operands of type 'T' and 'T'
在該行
if (result == default(T))
一切都很好,如果我基地UniqueList於抽象類。有什麼想法嗎?
你爲什麼不使用'HashSet的'這個?是不是你想要的 –
BrokenGlass
如果T是一個值類型,當沒有找到任何東西時,Find將返回'default(T)'?這意味着'default(T)'不被允許作爲一個值,這可能不是你的意圖。 –
@BrokenGlass但他沒有創建一組字符串,他創建了一組命名的東西。他真的想要一個'的HashSet'有'的IEqualityComparer ' –
phoog