我试图执行以下操作:
bool Has_Unique_Index<T>(Indexed<T> obj)
{
byte type = Verify_Type<T>(obj);
List<Indexed<T>> list;
switch (type)
{
case 0: list = DataSource.Clients; break;
case 1: list = DataSource.Rentals; break;
case 2: list = DataSource.Cars; break;
case 3: list = DataSource.Faults; break;
}
foreach (var i in list)
{
if (i.Index == obj.Index)
return false;
}
return true;
}
(无法弄清楚如何使用没有它们的三角括号消失在HTML空白中):
然而,编译器告诉我它不能将任何DataSource.x转换为List(Indexed(T))类型。
Verify_Type(T)(obj)确保T是交换机中的4个选项之一,因此List(Indexed(T))应该没问题 - 除了它不是指针或任何类型的东西
编辑:DataSource.x的类型为List(Indexed(T))。
EDIT2:正如人们所指出的,我实际上意味着源是List(索引(SOMECONCRETETYPE))。
答案 0 :(得分:2)
您可以通过(List<Index<T>>)
显式转换为Jan Zahradník
来解决编译错误。
case 0: list = (List<Index<T>>)DataSource.Clients.ToList(); break;
或简化方法:
bool Has_Unique_Index<T>(Indexed<T> obj)
{
byte type = Verify_Type<T>(obj);
switch (type)
{
case 0: return !DataSource.Clients.Any(r=> r.Index == obj.Index); break;
case 1: return !DataSource.Rentals.Any(r=> r.Index == obj.Index); break;
case 2: return !DataSource.Cars.Any(r=> r.Index == obj.Index); break;
case 3: return !DataSource.Faults.Any(r=> r.Index == obj.Index); break;
}
throw new Exception("unknown type: " + type);
}
答案 1 :(得分:1)
由于T是通用类型,我猜您不会拥有List<Indexed<T>>
类型的DataSource.Cars,而是List<Indexed<Car>>
。在T例如是T的情况下,当然不能将其转换为T.客户。让我们尝试向List<Indexed<T>>
添加显式强制转换为每个列表分配。
答案 2 :(得分:1)
您需要强制转换属性。我只做过一次:
bool Has_Unique_Index<T>(Indexed<T> obj)
{
byte type = Verify_Type<T>(obj);
object dataSource = null;
switch (type)
{
case 0: dataSource = DataSource.Clients; break;
case 1: dataSource = DataSource.Rentals; break;
case 2: dataSource = DataSource.Cars; break;
case 3: dataSource = DataSource.Faults; break;
default: return false; // or throw an exception etc.
}
bool result = (dataSource as List<Indexed<T>>).Any(x => x.Index == obj.Index);
return result;
}
答案 3 :(得分:1)
编译失败的原因与您在问题中的编辑稍有不正确的原因相同。您声明DataSource.x
个对象的类型为List<Indexed<T>>
,但实际上它们的类型为List<Indexed<SOMECONCRETETYPE>>
。
编译失败,因为至少有三个DataSource.x
对象 类型T
(即它们不是通用的;他们有不同的基础类型,这已经具体了。)
你可以“投射”#39;到List<Indexed<T>>
:
bool Has_Unique_Index<T>(Indexed<T> obj)
{
List<Indexed<T>> list == null;
switch (Verify_Type<T>(obj))
{
case 0: list = DataSource.Clients as List<Indexed<T>>; break;
case 1: list = DataSource.Rentals as List<Indexed<T>>; break;
case 2: list = DataSource.Cars as List<Indexed<T>>; break;
case 3: list = DataSource.Faults as List<Indexed<T>>; break;
}
MSDN:&#34; as运算符就像一个强制转换操作。但是,如果转换不可能,则返回null而不是引发异常。&#34;
如果list为null(类型超出范围或as
返回null),则抛出:
if (list == null)
throw SomeException();
我们可以使用IEnumerable.All代替foreach
循环:
return list.All(i => i.Index != obj.Index);
}
当然,您可以在Jesse James&#39;中选择较短的代码。回答完全避免了演员/转换。