我寫簡單的解析器和接下來要實現兩個接口:泛型類型的引用對方
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