我最近发现了语言错误,在学习过程中,我开始按照Bob Nystrom的Crafting Interpreters书的方式工作,并尝试用C#重新创建JLOX语言解释器。

JLOX中的“ J”指的是用Java实现的Book中的示例代码。

在bok的“使用树”和“ A(不是很漂亮)打印机”部分中,Bob介绍了Visitor模式作为“表达问题”的解决方案。

我试图将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的这一行上:


  重写公共字符串VisitBinaryExpr(Expression.Binary表达式)


Visual Studio编辑器报告的错误文本为:


  错误CS0115'ASTPrinter.VisitBinaryExpr(Expression.Binary)':找不到合适的方法来覆盖


我想我只是对C#通用返回类型不够了解。

我一直在寻找有关通用返回类型的信息,但是到目前为止,我还没有找到一个明确的示例说明它如何与抽象接口的具体实现进行交互。也许这是C#和Java的泛型功能差异很大,无法直接实现的地方。

任何意见,将不胜感激。

最佳答案

您的Expression.Visitor<string>是一个接口,因此没有要覆盖的内容。

简单的说:

public string VisitBinaryExpr(Expression.Binary expression)


仅当基类已经定义了具有声明为overridevitrual的相同签名的方法时,才需要abstract

在您的情况下,类ASTPrinter直接从System.Object派生。

10-06 09:40