指向我在 C# 中选择的变量
本文关键字:选择 变量 | 更新日期: 2023-09-27 18:34:47
我正在尝试执行以下操作:
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(( 应该没问题 - 除了它不是指针或类似的东西。
- 如何使用 switch 语句(或任何其他方法(在 C# 中指向我选择的变量?
编辑:DataSource.x的类型为List(Indexed(T((。
编辑2:正如人们指出的那样,我实际上的意思是来源类型为List(Indexed(SOMECONCRETETYPE((。
您可以通过显式转换为(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);
}
您需要强制转换属性。我只会像这样做一次:
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;
}
由于T是通用类型,我猜你没有数据类型List<Indexed<T>>
的DataSource.Cars,而是List<Indexed<Car>>
。当然,在 T 是例如的情况下,不能强制转换为 T。客户。让我们尝试为每个列表分配添加显式强制转换以List<Indexed<T>>
。
编译失败的原因与您在问题中的编辑略有错误的原因相同。您声明DataSource.x
对象属于 List<Indexed<T>>
类型,但实际上它们属于 List<Indexed<SOMECONCRETETYPE>>
类型。
编译失败是因为至少三个DataSource.x
对象不属于目标类型的T
(即它们不是泛型的;它们具有不同的基础类型,这些类型已经是具体的(。
您可以"投射"到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:"as 运算符就像一个强制转换操作。但是,如果转换不可行,则 as 返回 null 而不是引发异常。
如果列表为 null(类型超出范围或返回 null as
则抛出(:
if (list == null)
throw SomeException();
我们可以使用 IEnumerable.All 而不是 foreach
循环:
return list.All(i => i.Index != obj.Index);
}
当然,您可以在Jesse James的答案中选择较短的代码,从而完全避免转换/转换。