【问题标题】:Cannot apply indexing with [] to an expression of type '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()]);
}
}

【问题讨论】:

    标签: c# .net algorithm .net-5 c#-5.0


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2011-04-06
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    相关资源
    最近更新 更多