我写了一个简单的解析器,想要实现下面两个接口:
public interface IResult<TValue, TToken>
where TToken : ITokenizer<IResult<TValue, TToken>, TValue>
{
TToken Tokenizer { get; }
TValue Value { get; }
}
public interface ITokenizer<TResult, TValue>
where TResult : IResult<TValue, ITokenizer<TResult, TValue>>
{
TResult Advance();
}
它的主要目的是:ITokenizer
是一个不可变类,用于通过标记拆分字符串。我们可以调用Advance
方法并获取Result
:下一个标记和下一个分词器。因此,我希望在Result
类中存储标记和分词器,并希望为此添加编译时约束。
现在,在构建这两个接口时,我遇到了编译时错误。
我认为下面的类可以实现所有约束的接口:
public class Result : IResult<string, Tokenizer>
{ /* implement interface */}
public class Tokenizer : ITokenizer<Result, string>
{ /* implement interface */}
有人能解释一下出了什么问题吗?或者为什么这段代码是不可能的,或者如何使这段代码正确?
P.S. 对于我的任务,我可以简单地使用没有任何限制的 IResult<TValue, TToken>
接口,但是我能否在不失去约束的情况下实现这个接口呢?
编译器错误:
(3:22) The type 'Test.IResult<TValue,TToken>' cannot be used as type parameter 'TResult' in the generic type or method 'Test.ITokenizer<TResult,TValue>'.
There is no implicit reference conversion from 'Test.IResult<TValue,TToken>' to
'Test.IResult<TValue,Test.ITokenizer<Test.IResult<TValue,TToken>,TValue>>'.
(10:22) The type 'Test.ITokenizer<TResult,TValue>' cannot be used as type parameter 'TToken' in the generic type or method 'Test.IResult<TValue,TToken>'.
There is no implicit reference conversion from 'Test.ITokenizer<TResult,TValue>' to
'Test.ITokenizer<Test.IResult<TValue,Test.ITokenizer<TResult,TValue>>,TValue>'.
public interface Circular<T> where T : Circular<T>
这样的简单循环引用是被允许并且可以工作的呢? - Nikita SivukhinIResult<TValue, TToken>
是从约束中的IResult<TValue, ITokenizer<IResult<TValue, TToken>, TValue>
。 - Nikita Sivukhinout
关键字标记类型参数,仍然会有编译错误...或者您建议其他方法? - Nikita Sivukhin