指向我在 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((。

指向我在 C# 中选择的变量

您可以通过显式转换为(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的答案中选择较短的代码,从而完全避免转换/转换。