我写简单的解析器和接下来要实现两个接口:泛型类型的引用对方
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>'.
2件事:请将编译错误添加到您的文章中,以便我们知道它是什么,其次可能告诉我们您正在尝试做什么,因此我们知道您为什么选择此解决方案。可能有更好的解决方案,你会得到更多的想法。 – CodingYoshi
@CodingYoshi我不想深究这种情况,因为我想了解为什么这段代码不能编译。我认为这有一个潜在的基本原因,我现在不明白。 –
但您有循环引用:IResult类型约束取决于ITokenizer和vica。 – Evk