저는 공장을 사용하여 IComparer<User>
개체를 만들어 사용자 목록을 정렬하고 있습니다.불필요한 인터페이스 캐스트?
두 클래스가 있습니다. 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() :
) : 얻을 그래서 문제가 무엇, 모두 IComparer 개체입니다, 나는 그것이 무엇을 의미하는지 이해 해달라고
Type of conditional expression cannot be determined because there is no implicit conversion between 'Test.UserFirstNameComparer.Ascending' and 'Test.UserFirstNameComparer.Descending'
를? 이상한 것은 내가 (? 불필요) 캐스트 오류를 수정할 수 있다는 것입니다 : 나는 두 경우 모두에 캐스팅 할 때 물론
// 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는)
이 질문에 대한 답변보기 : http://stackoverflow.com/questions/202271/why-is-this-code-invalid-in-c –
두 개의 'Comparers'(매우 어리석은 것) 대신에, 왜 당신은 그냥 하나의 일반'Comparer' (오름차순)를 만들고 list.Sort (cmp) .Reverse() 또는 list.OrderBy (cmp)/list.OrderByDescending (cmp) 할합니까? – Davio
위와 같이'-1'을 곱하면'Compare' 호출의 결과 값이'-2147483648'이면 원하는대로 동작하지 않습니다. 일부 'Compare'구현은'-1','0' 및'+ 1' 이외의 다른 값을 반환하며 그렇게 할 수 있습니다. –