Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

C# codegen: generated `Equals(object)` on `[SpacetimeDB.Type]` structs recurses forever

Đã đóng Phù hợp với người mới
#6,124 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Một pull request liên quan đã được merge.

  • #6303 của @lisandroct — đã merge

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
72/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
csharp
Lĩnh vực
devtools

Hướng nghiên cứu

Lỗi nằm trong bộ sinh mã nguồn C# tại crates/bindings-csharp/BSATN.Codegen/Type.cs, khoảng dòng 809-818, nơi phương thức ghi đè Equals(object) được sinh ra cho struct gọi Equals(that_) trên một Nullable rồi đệ quy. Hãy bắt đầu bằng cách đọc mã của emitter, sau đó tái hiện lỗi với struct Cell và ví dụ Equals(a, b) trong issue. Hoàn thành khi phương thức ghi đè được sinh ra lấy giá trị từ nullable, chẳng hạn bằng cách gọi Equals(that_.Value), và reducer không còn tràn stack nữa.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Version: SpacetimeDB.Runtime 2.11.*, still on master e596513
Where: crates/bindings-csharp/BSATN.Codegen/Type.cs ~L809-818

public override bool Equals(object? that) {
    if (that == null) return false;
    var that_ = that as VoipCellCoord?;          // for structs this is Nullable<T>
    if (((object?)that_) == null) return false;
    return Equals(that_);                        // binds to Equals(object?) again → infinite recursion
}

Repro:

[SpacetimeDB.Type] public partial struct Cell { public int X; public int Y; }

[SpacetimeDB.Reducer]
public static void Repro(ReducerContext ctx) {
    Cell a = new() { X = 1 }; Cell? b = new Cell { X = 1 };
    var same = Equals(a, b);   // object.Equals → Cell.Equals(object) → stack overflow, wasm trap
}

Actual: the reducer traps with a deep recursion through VoipCellCoord__Equals_0 (RhBox at the bottom). Anything
that goes through Equals(object) is affected: object.Equals, EqualityComparer<T>.Default on boxed values,
collections of boxed structs.
Fix: for structs, return Equals(that_.Value); (or that is T t && Equals(t)).

Ngôn ngữ chính
Rust
Star
25.3k
Fork
1.1k
Merge trung bình
2 ngày 18 giờ
Pull request đã merge (30 ngày)
65

Chuẩn bị môi trường

  • Có Dockerfile hoặc tệp Docker Compose
  • Có mẫu pull request
  • Không có hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của clockworklabs/SpacetimeDB

Tất cả issue của clockworklabs/SpacetimeDB

Issue tương tự

Thêm issue về Rust

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.