当我试图从Jon Skeet的书C#深入调整清单3.4时,我收到以下错误消息...
类型'list_3_4.Dog'不能用作泛型类型或方法'list_3_4.Program.CompareToDefault(T)'中的类型参数'T'.没有从'list_3_4.Dog'到'System.IComparable'的隐式引用转换.
这是我的代码......
using System;
namespace list_3_4
{
class Program
{
static void Main(string[] args)
{
//string mystring;
Dog d = new Dog("howie");
Console.WriteLine(CompareToDefault("x"));
Console.WriteLine(CompareToDefault(10));
Console.WriteLine(CompareToDefault(0));
Console.WriteLine(CompareToDefault(-10));
Console.WriteLine(CompareToDefault(DateTime.MinValue));
Console.WriteLine(CompareToDefault(d));
Console.ReadKey();
}
static int CompareToDefault<T> (T value) where T: IComparable<T>
{
return value.CompareTo(default(T));
}
}
public class Dog
{
private string _name;
public Dog(string name)
{
_name = name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何添加像"狗"这样的引用类型来使用Jon Skeets代码列表??? 我知道Dog需要实现IComparable但我不知道怎么做!
gid*_*eon 12
您可以通过说明需要一个类型T来定义方法IComparable<T>:
where T: IComparable<T>
Run Code Online (Sandbox Code Playgroud)
但是Dog没有实施IComparable<Dog>
你需要这样做:
public class Dog : IComparable<Dog>
{
//this will allow you to do a quick name comparison
public string Name { get; set;}
public int CompareTo(Dog other)
{//compare dogs by name
return this._name.CompareTo(other.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:对于引用类型default(T)将返回null,因此您应该在某处执行null检查.阅读有关msdn的默认值.
你的Dog班级应该实施IComparable<T>.
public class Dog: IComparable<Dog>
{
private string _name;
public Dog(string name)
{
_name = name;
}
public int CompareTo( Dog other )
{
if (other == null)
return 1;
return string.Compare( _name, other._name );
}
}
Run Code Online (Sandbox Code Playgroud)