Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

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

オープン 初心者向け
#6,124 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
72/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
csharp
領域
devtools

調査の方向性

バグは C# ソースジェネレーターの crates/bindings-csharp/BSATN.Codegen/Type.cs の809〜818行目付近にあります。struct 向けに生成される Equals(object) のオーバーライドが、Nullable に対して Equals(that_) を呼び出し、再帰してしまいます。まずこのエミッターのコードを読み、その後 issue の Cell struct と Equals(a, b) の例で再現してください。生成されたオーバーライドが、たとえば Equals(that_.Value) を呼び出して nullable の値をアンラップし、reducer がスタックオーバーフローを起こさなくなれば完了です。

索引モデルが issue の本文から書いたものです。

説明

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)).

主要言語
Rust
スター
25.3k
フォーク
1.1k
平均マージ
4日 6時間
マージ済み PR(30日)
43

環境構築

  • Dockerfile または Docker Compose ファイルあり
  • プルリクエストのテンプレートあり
  • コントリビューションガイドなし

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

clockworklabs/SpacetimeDB のほかの issue

clockworklabs/SpacetimeDB の issue をすべて見る

似ている issue

Rust の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。