CSh*_*ned 6 .net c# generics icomparable
我对泛型非常新,我正在尝试编写一个简单的类,它将是通用的,但也允许对字符串成员变量进行一些描述的排序.
目前我有一个基本类,但是当我尝试实现接口成员CompareTo()时,我在顶部收到一个错误,告诉我它没有实现.这是什么问题?
using System;
namespace GenericsPracticeConsole.Types
{
class SortableGenericType<T> : IComparable
{
private T t;
private string stringName;
public T name
{
get { return t; }
set { t = value; }
}
public int CompareTo(SortableGenericType<T> ourObject)
{
return stringName.CompareTo(ourObject.stringName);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有两个接口IComparable和IComparable<U>.IComparable是较旧的(在泛型之前),它要求将实例与任意对象进行比较.IComparable<U>需要将实例与实例进行比较U.如果您要声明将比较stringName字段上的SortableGenericType实例,那么您应该这样做:
class SortableGenericType<T> : IComparable<SortableGenericType<T>>
{
//
}
Run Code Online (Sandbox Code Playgroud)
如果您还想实现IComparable:
class SortableGenericType<T> : IComparable, IComparable<SortableGenericType<T>>
{
private string stringName;
public T name { get; set; }
public int CompareTo(SortableGenericType<T> ourObject)
{
//I forgot to add this statement:
if(ourObject == null)
return -1;
return stringName.CompareTo(ourObject.stringName);
}
public int CompareTo(object obj)
{
if (obj.GetType() != GetType())
return -1;
return CompareTo(obj as SortableGenericType<T>);
}
}
Run Code Online (Sandbox Code Playgroud)
如果你的类是将要举办类型的项目的集合T,你需要这些物品的订购(这不是你问什么,但它是最常见的情况)比你需要T为IComparable<T>:
class SomeCollection<T> where T : IComparable<T>
{
private List<T> items;
private void Sort()
{
//
T item1;
T item2;
if(item1.CompareTo(item2) < 0)
{
//bla bla
}
}
}
Run Code Online (Sandbox Code Playgroud)
IComparable定义了该方法public int CompareTo(object obj).请注意参数类型 - 它是object,而不是您自己的类型.这就是为什么你实际上没有实现接口.
你需要做的是实施 IComparable<SortableGenericType<T>>