【发布时间】:2014-07-09 11:53:06
【问题描述】:
我正在使用工厂创建IComparer<User> 对象来对用户列表进行排序。
我有 2 个类:Ascending 和 Descending,都实现了 IComparer<User>。这是代码:
namespace Test
{
public class Program
{
public static void Main(string[] args)
{
List<User> users = new List<User>();
users.Add(new User("foo", "bar"));
// ...
IComparer<User> cmp = ComparerFactory.GetComparer("FirstName", true);
if (cmp != null)
{
users.Sort(cmp);
}
}
}
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public User(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}
public class UserFirstNameComparer
{
public class Ascending : IComparer<User>
{
public int Compare(User u1, User u2)
{
return String.Compare(u1.FirstName, u2.FirstName, true);
}
}
public class Descending : IComparer<User>
{
public int Compare(User u1, User u2)
{
return new UserFirstNameComparer.Ascending().Compare(u1, u2) * -1;
}
}
}
public static class ComparerFactory
{
public static IComparer<User> GetComparer(string fieldName, bool ascending)
{
switch (fieldName)
{
case "FirstName":
return ascending ?
new UserFirstNameComparer.Ascending() : // ERROR IS HERE
new UserFirstNameComparer.Descending();
//...
}
return null;
}
}
但我收到一个错误(行:new UserFirstNameComparer.Ascending() :):
Type of conditional expression cannot be determined because there is no implicit conversion between 'Test.UserFirstNameComparer.Ascending' and 'Test.UserFirstNameComparer.Descending'
我不明白这是什么意思,两者都是 IComparer 对象,那么有什么问题? 奇怪的是,我可以通过(不必要的?)演员来修复错误:
// This works
return ascending ?
(IComparer<User>) new UserFirstNameComparer.Ascending() :
new UserFirstNameComparer.Descending();
// This works too
return ascending ?
new UserFirstNameComparer.Ascending() :
(IComparer<User>) new UserFirstNameComparer.Descending();
当然,当我在这两种情况下施放时它都有效。但我不明白为什么它只适用于一个演员表,以及为什么没有演员表时它不起作用。有什么想法吗?
(我使用的是 VS 2012,.NET v4.0.30319)
【问题讨论】:
-
查看这个问题的答案:stackoverflow.com/questions/202271/…
-
与其拥有两个
Comparers(这很愚蠢),不如只创建一个常规Comparer(升序)并执行 list.Sort(cmp).Reverse() 或list.OrderBy(cmp) / list.OrderByDescending(cmp)? -
请注意,如果
Compare调用的返回值为-2147483648,则如上所述乘以-1将无法正常工作。一些Compare实现确实返回了除-1、0和+1之外的其他值,并且被允许这样做。