Je vous écris analyseur simple et veulent mettre en œuvre deux interfaces suivantes:références types génériques les uns des autres
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();
}
Il a ensuite objectif: ITokenizer
est une classe immuable pour diviser la chaîne par des jetons. Nous pouvons appeler la méthode Advance
et obtenir Result
: jeton suivant et tokenizer suivant. Donc, je veux un jeton de stockage et un tokenizer dans la classe Result
et je veux ajouter une contrainte de compilation pour cela.
Maintenant, j'ai une erreur de compilation lors de la construction de ces deux interfaces.
Je pensais que les classes suivantes peuvent implémenter des interfaces avec toutes les contraintes:
public class Result : IResult<string, Tokenizer>
{ /* implement interface */}
public class Tokenizer : ITokenizer<Result, string>
{ /* implement interface */}
Quelqu'un peut-il expliquer ce qui ne va pas? Peut-être pourquoi c'est impossible ou comment rendre ce code correct?
P.S. Pour ma tâche je peux simplement utiliser l'interface IResult<TValue, TToken>
sans aucune contrainte, mais puis-je l'implémenter sans perdre de contraintes?
erreurs de compilation:
(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 choses: S'il vous plaît ajouter l'erreur de compilation à votre poste afin que nous sachions ce que c'est et d'autre part peut-être nous dire ce que vous essayez de faire, nous savons pourquoi vous avez choisi cette solution. Il y a peut-être une meilleure solution et vous aurez plus d'idées. – CodingYoshi
@CodingYoshi Je ne veux pas aller au fond de la situation parce que je veux comprendre pourquoi ce code ne compile pas. Je pense qu'il y a une raison fondamentale sous-jacente à cela, que je ne comprends pas maintenant. –
Mais vous avez ici une référence circulaire: Les contraintes de type IResult dépendent de ITokenizer et vice versa. – Evk