【发布时间】:2016-11-19 15:29:00
【问题描述】:
我写了一个简单的解析器,想实现接下来的两个接口:
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: next token 和 next tokenizer。所以,我想在Result 类中存储标记和标记器,并为此添加编译时约束。
现在我在构建这两个接口时遇到了编译时错误。
我认为下一个类可以实现具有所有约束的接口:
public class Result : IResult<string, Tokenizer>
{ /* implement interface */}
public class Tokenizer : ITokenizer<Result, string>
{ /* implement interface */}
谁能解释一下怎么回事?也许为什么不可能或如何使这段代码正确?
附:对于我的任务,我可以简单地使用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>'.
【问题讨论】:
-
两件事:请将编译错误添加到您的帖子中,以便我们知道它是什么,其次也许告诉我们您正在尝试做什么,以便我们知道您选择此解决方案的原因。可能有更好的解决方案,你会得到更多的想法。
-
@CodingYoshi 我不想深入了解这种情况,因为我想了解为什么这段代码无法编译。我认为有一个潜在的基本原因,我现在不明白。
-
但是你有循环引用:IResult 类型约束取决于 ITokenizer,反之亦然。
-
错误很明显,它表示无法将 IResult
转换为 IResult , TValue>>。我不知道你还想知道什么? -
@Evk 但是为什么像
public interface Circular<T> where T : Circular<T>这样的简单循环引用是允许的并且有效?
标签: c# generics generic-constraints