更正类对象列表中项的值的更正方法

zet*_*tar 1 c# class list

鉴于这样一个类:

 public class Dinosaur
{
    public string Specie { get; set; }
    public int Age { get; set; }
    public int Weight { get; set; }
    public Point Location { get; set; }

    // Constructor
    public Dinosaur()
    {

    }
Run Code Online (Sandbox Code Playgroud)

和这样的列表:

        public static List<Dinosaur> Dinosaurs = new List<Dinosaur>();
Run Code Online (Sandbox Code Playgroud)

更改列表中最后一项的值的正确方法是什么?这会抛出一个错误("'System.Collections.Generic.List.this [int]'的最佳重载方法匹配有一些无效的参数"):

Dinosaurs[Dinosaurs.Last()].Location.X = pixelMousePositionX;
Run Code Online (Sandbox Code Playgroud)

一如既往,提前谢谢!Stackoverflow一直是这个项目的救命稻草.

Tim*_*ter 9

Dinosaurs.Last() 返回已经是最后一项,因此您根本不需要索引器.

Dinosaurs.Last().Location.X = pixelMousePositionX;
Run Code Online (Sandbox Code Playgroud)

现在它抛出了这个错误:无法修改'DinosaurIsland.Dinosaur.Location'的返回值,因为它不是变量

这是因为它Point是结构而不是引用类型.所以你必须创建一个新点.

Point oldLocation = Dinosaurs.Last().Location;
Dinosaurs.Last().Location = new Point { X = pixelMousePositionX, Y = oldLocation.Y };
Run Code Online (Sandbox Code Playgroud)

  • 没错,在C#中,结构是不可变的(你不能在它们制作后改变它们).DataTime是另一个很好的例子. (2认同)

Dav*_*d M 5

Dinosaurs.Last() 返回最后一项,而不是它的索引,所以这样:

Dinosaurs.Last().Location.X = pixelMousePositionX;
Run Code Online (Sandbox Code Playgroud)

如果你想通过索引来做,那么:

Dinosaurs[Dinosaurs.Count - 1].Location.X = pixelMousePositionX;
Run Code Online (Sandbox Code Playgroud)