2

Func<T>オブジェクトインスタンス内のプロパティを評価する式を作成しようとすると、いくつかの困難があります。

var t = new Transition<ILexeme>( 1, () => TokenType == eToken.TOKEN_COMMENT );

Visual Studio コンパイラは、オブジェクト インスタンスを想定しているため、非静的フィールド、メソッド、またはプロパティ 'ILexeme.TokenType.get' にはオブジェクト参照が必要です というエラーが発生しILexemeます。

私がやろうとしているのは、遷移関数のデリゲートを呼び出すために使用するステート マシンを作成することです。これは、プロパティの値がトークン ストリーム内で一致するFunc<T>かどうかをテストします。等しい場合、マシンは次の状態に移行します。eTokeneToken

ILexeme問題は、ジェネリック型としてクラスに渡しているTransitionことですが、トランジション関数でジェネリック型内のプロパティを使用する必要がありますTokenType。私の質問は、値の型、つまり、、などで機能する必要あることを念頭に置いて、このベアリングをどのように達成できるかということです。charint

ILexeme の定義は次のとおりです。

public interface ILexeme
{
    eToken TokenType { get; }
    String TokenString { get; }
}

ILexeme の具体的な実装は次のとおりです。

public enum eToken : int
{
    TOKEN_COMMENT,
    TOKEN_SEPARATOR
}

public class Token : ILexeme
{
    public eToken TokenType { get; }
    public String TokenString { get; }
}

そして、これはトランジションの定義です:

public readonly int FromState;
public readonly int ToState;
public readonly Func<T> Input;

public Transition( int fromState, Func<T> input, int toState )
{
    this.FromState = fromState;
    this.ToState = toState;
    this.Input = input;
}
4

3 に答える 3

2

ラムダ式の書き方が間違っていると思います。はインスタンス プロパティであるためTokenType、オブジェクトのインスタンスをラムダに渡す必要があります。現在はパラメータなしです。だから、私はそれが次のようなものであるべきだと思います

var t = new Transition<ILexeme>( 1, eTok => eTok.TokenType == eToken.TOKEN_COMMENT );

そしてトランジションクラス

public readonly int FromState;
public readonly int ToState;
public readonly Func<T, bool> Input;

public Transition( int fromState, Func<T, bool> input, int toState )
{
    this.FromState = fromState;
    this.ToState = toState;
    this.Input = input;
}

また、クラスに 2 番目の型パラメーターを導入したい場合がTransitionあるため、非常に一般的なものになります。

class Transition<TInput, TResult> {
public readonly int FromState;
public readonly int ToState;
public readonly Func<T, TResult> Input;

public Transition( int fromState, Func<T, TResult> input, int toState )
{
    this.FromState = fromState;
    this.ToState = toState;
    this.Input = input;
}
}

その場合は、where 句を使用していくつかの型制約を配置することをお勧めします。

于 2012-11-20T14:48:48.647 に答える
2

-constructorTransition<ILexeme>では、 を期待してFunc<ILexeme>いますが、 を提供していますFunc<bool>

于 2012-11-20T14:46:50.817 に答える
1

取得しているエラーは、TokenType が ILexeme 型のプロパティであるために発生しますが、コンストラクターへの呼び出しにはその型の有効なインスタンスがありません。おそらく、あなたの宣言は

public Transition(int fromState, Func<T, bool>, int toState) { /* ... */ }

次に、コードを次のように記述できます。

var t = new Transition<ILexeme>(1, lex => lex.TokenType == eToken.TOKEN_COMMENT, 2);
于 2012-11-20T14:55:22.823 に答える