я пишу простой синтаксический анализатор и хотите реализовать следующий два интерфейса:Обобщенные типы ссылок друг на друга
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 versa. – Evk