Antlr と式ツリーを使用して言語を書いています。
ツリー パーサーが加算を生成するときに使用する標準のファクトリ メソッドを定義しました。これは、組み込みの整数型に対して非常にうまく機能します。次に、より一般的な型に進みます。
現時点では信じられないほどナイーブで、これを行うだけです (進行中の TDD コードは、しばしばナイーブに見えます!?):
protected Expression GenerateAdd(Expression left, Expression right)
{
if (left.Type.Equals(right.Type))
return Expression.Add(left, right);
if (left.Type.IsValueType && right.Type.IsValueType)
Promote7_2_6_2(ref left, ref right);
return Expression.Add(left, right);
}
WherePromote7_2_6_2
は、C# 仕様 7.2.6.2 で定められた統合昇格の規則に従う Convert 式を生成します (言語は C# に似ていますが、JScript とクロスオーバーし、他のまったく新しいキーワードがあります)。
当然のことながら、文字列の追加のテストに移りました。つまり"a" + "b";
、次のエラーが表示されます。
System.InvalidOperationException: The binary operator Add is not defined for the types 'System.String' and 'System.String'.
十分に公平です-私はSystem.Stringを反映しており、演算子が実際に定義されていないことを十分に確認しています。次のようなテスト メソッドで式ツリーを生成します。
Expression<Func<string, string, string>> e = (s1, s2) => s1 + s2;
Add BinaryExpression が実際に作成されているが、実装メソッドがいずれかのメソッドに設定されていることを示していstring.Concat
ます。
場合によっては、このようなことを検討する必要があることは承知していましたが、このように足し算を定義する型が他にいくつあるでしょうか? それはただstring
ですか?
それは C# コンパイラに埋め込まれたルールですか?それとも、他の型でそのようなメソッドを自動検出するために使用できるある種の検出可能なメタ データはありますか?
前もって感謝します!