尝试将 LOX 语言实现从 Crafting Interpreter 的书中移植到 C# 时遇到泛型问题

Trouble with generics when trying port the LOX language implementation from the Crafting Interpreter's book to C#

我最近发现了语言错误,作为我学习过程的一部分,我已经开始阅读 Bob Nystrom 的 Crafting Interpreters 书,并尝试用 C# 重新创建 JLOX 语言解释器。

JLOX中的"J"是指Java中实现的Book中的示例代码。

在本书的 "Working with Trees" 和 "A (Not Very) Pretty Printer" 部分,Bob 介绍了访问者模式作为 "Expression Problem".

的解决方案

我试图将 Java 代码翻译成 C#,但现在遇到以下编译器错误:

"ASTPrinter.VisitBinaryExpr(Expression.Binary): No suitable method found to override" (点击看图)

两个相关的代码文件是:

Expression.cs:

使用系统;

namespace CSharpLox
{
    abstract public class Expression
    {
        abstract public T Accept<T>(Visitor<T> visitor);

        public interface Visitor<T>
        {
            T VisitBinaryExpr(Binary expr);
            // other expression type visitors removed for clarity...
        }

        public class Binary : Expression
        {
            public readonly Expression left;
            public readonly Token _operator;
            public readonly Expression right;

            public Binary(Expression left, Token _operator, Expression right)
            {
                this.left = left;
                this._operator = _operator;
                this.right = right;
            }

            override public T Accept<T>(Visitor<T> visitor)
            {
                return visitor.VisitBinaryExpr(this);
            }
        }

        // other expression types removed for clarity...
    }
}

ASTPrinter.cs:

using System;
using System.Text;

namespace CSharpLox
{
    // ASTPrinter.cs
    public class ASTPrinter : Expression.Visitor<string>
    {
        override public string VisitBinaryExpr(Expression.Binary expression)
        {
            return parenthesize(expression._operator.lexeme, expression.left, expression.right);
        }

        private String parenthesize(String name, params Expression[] expressions)
        {
            StringBuilder builder = new StringBuilder();

            builder.Append("(").Append(name);

            foreach (Expression expression in expressions)
            {
                builder.Append(" ");
                builder.Append(expression.Accept(this));
            }

            builder.Append(")");

            return builder.ToString();
        }
    }
}

不知道怎么解决的错误在ASTPrinter.cs这一行:

override public string VisitBinaryExpr(Expression.Binary expression)

Visual Studio编辑器报错文本为:

Error CS0115 'ASTPrinter.VisitBinaryExpr(Expression.Binary)': no suitable method found to override

我想我只是对 C# 泛型 return 类型了解不够。

我一直在四处寻找关于泛型 return 类型的信息,但到目前为止我还没有找到一个明确的例子来说明它如何与抽象接口的具体实现交互。或者也许这是 C# 和 Java 的泛型功能对于实现的直接转换来说差异太大的领域。

如有任何建议,我们将不胜感激。

你的 Expression.Visitor<string> 是一个接口,所以没有什么可以覆盖的。

简单地说:

public string VisitBinaryExpr(Expression.Binary expression)

只有当基础 class 已经定义了一个具有与声明为 vitrualabstract.[=17 的相同签名的方法时,您才需要 override =]

在您的情况下,class ASTPrinter 直接派生自 System.Object