我正在尝试为以下Java代码编写一些等效的C#代码:

public class XLexer extends antlr.CharScanner implements TokenStream {
protected int stringCtorState = 0;

public String mString() { return ""; }

public Token nextToken()  {
       resetText(); // exists in CharScanner class
       return null; // will return something
}

public TokenStream plumb() {
    return new TokenStream() {
        public Token nextToken()  {
            resetText(); // exists in CharScanner class
            if (stringCtorState >= 0) { String x = mString(); }
            return null; // will return something
        }
    };
}


}

谁能给我一个提示,用C#怎么做,因为在return语句中定义nextToken方法时出现错误。

谢谢!

最佳答案

C#中没有匿名类(在您需要的意义上)。如果要返回TokenStream的自定义实现的实例,则需要对其进行定义并为其命名。

例如。:

public MyTokenStream {
    public Token nextToken() {
        // ...
    }
}

public TokenStream plumb() {
    return new MyTokenStream();
}


看到:


http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
http://www.25hoursaday.com/CsharpVsJava.html(“希望在这里”部分列出了匿名内部类;“此部分描述了Java中存在的语言功能和概念,没有C#对应语言”)。


以供参考。

正如kan所言,在C#(以及Java 8)中,通常将使用委托或lambda代替。
如果TokenStream所做的全部是返回nextToken,则可以这样实现:

    public class TokenStream
    {
    }

    public class SomeClass
    {
        public Func<TokenStream> Plumb()
        {
            // I'm returning a function that returns a new TokenStream for whoever calls it
            return () => new TokenStream();
        }
    }

    static void Main(string[] args)
    {
        var someClass = new SomeClass();
        TokenStream stream = someClass.Plumb()(); // note double brackets
    }


考虑一下JavaScript中的一流函数,如果有助于解决问题的话。

新的Java带来了功能接口,类似于:http://java.dzone.com/articles/introduction-functional-1

10-02 03:07
查看更多