无法将带有 [] 的索引应用于“type”类型的表达式

Posted

技术标签:

【中文标题】无法将带有 [] 的索引应用于“type”类型的表达式【英文标题】:Cannot apply indexing with [] to an expression of type 'type' 【发布时间】:2022-01-17 07:43:10 【问题描述】:

大家!我是编程新手,希望对您有所帮助!我正在尝试返回和索引数组,但不知道错误是什么意思。第一次买这个。

这是我的第一堂课

using System;
using System.Linq;

public class Group

private Student[] students;

public Group(Student[] students)

    if(students.Length < 5)
    
        throw new ArgumentException("Incorrect group");
    

    this.students = students;


public int IndexOfMaxGrade()

    Student[] sorted = students.OrderBy(c => c.grade).ToArray();
    //int max = sorted[^1].grade;

    //foreach (var item in students)
    //
    //    if(item.grade == max)
    //    
            
    //    
    //

    return Array.IndexOf(students, sorted[^1].grade);


public int IndexOfMinGrade()

    Student[] sorted = students.OrderBy(c => c.grade).ToArray();

    return Array.IndexOf(students, sorted[0].grade);


我在这段代码(最后 2 行)上出现“无法使用 [] 对类型为 'type' 的表达式应用索引”

    Group studentGroup;

    try
    
        studentGroup = new Group(students.ToArray());
    
    catch (ArgumentException argumentException)
    
        Console.WriteLine(argumentException.Message);
        return;
    

    Console.WriteLine(studentGroup[studentGroup.IndexOfMinGrade()]);
    Console.WriteLine(studentGroup[studentGroup.IndexOfMaxGrade()]);


【问题讨论】:

【参考方案1】:

如果你想直接索引Group,你必须提供一个索引器:

public class Group

  public Student this[int i]
    get  return students[i]; 
    set  students[i] = value; 
  
  ...

你看,你的 Group 有一个学生数组,但这并不意味着它本身可以像数组一样直接索引。

当你这样做时:

Group studentGroup = ...

您后来尝试访问组内某个索引处的某些内容:

studentGroup[studentGroup.IndexOfMinGrade()];     //like this
studentGroup[1];                                  //or like this, for example

C# 不会查看您的 Group 类型并认为“它里面只有一个数据项,它是一个数组,所以我允许有人在 Group 的实例旁边放置一个索引说明符,例如 [1],我将从内部数组中检索项目”..

..它只是说“无法索引组”


如果您添加一个索引器,那么快乐的日子。你也可以这样做:

class Group
  ...

  public Student GetStudentAt(int index)
    return students[index];
  

然后调用:

  Console.WriteLine(studentGroup.GetStudentAt(studentGroup.IndexOfMinGrade()));

概念上等价的..

【讨论】:

另一种选择是让 Students 属性本身可从外部访问(可能是 IReadOnlyList&lt;&gt;,例如)。然后使用studentGroup.Students[...] 访问各个元素。这也使消费者能够以 StudentGroup 类未明确公开的其他方式(例如使用 LINQ 方法)查询学生列表。除非有特定原因只允许在特定索引处抓取学生。 考虑过,但不想进入“属性不应返回数组”/interfaces/readonlylist/generics 等。这似乎是 Comp Sci 101

以上是关于无法将带有 [] 的索引应用于“type”类型的表达式的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 [] 将索引应用于“System.Dynamic.DynamicObject”类型的表达式

无法使用 [] 将索引应用于“对象”类型的表达式

无法使用索引类型为“(section)”的“[Array<String>]”类型的值下标。类型”(又名“section.Type”)

如何将 [] 索引应用于“ISession”类型的表达式?

无法从 Rails 4 和 PSQL 9.3 中的表中删除索引

PutParcelable 不能应用于 Place.Type 错误?