2

メソッド呼び出しに無効な引数があるというコンパイル時エラーが発生します。

public abstract class EntityBase
{
    public virtual List<ValidationResult> Validate<T>()
    {
        // This line causes the error:
        var validationResults = this.ValidateEntity<T>(this, true).ToList();
    }

    protected IEnumerable<ValidationResult> ValidateEntity<T>(T entity, bool ignoreNullViolations)
    {
        // Code here
    }
}

クラスは抽象です。それでいいはずです。メソッド シグネチャで T の型を指定しようとしましたが、役に立ちませんでした。なぜこれはコンパイルされないのですか? thisT パラメータを期待するメソッドに渡すことはできませんか?

編集- 可能な解決策:

public virtual List<ValidationResult> Validate<T>() where T : class
{
    var validationResults = this.ValidateEntity<T>(this as T, true).ToList();
}

編集2

T はサブクラスのみであるべきなので、クラス シグネチャをジェネリックに変更して、サブクラスに強制的に設定させる必要があると思います。そうすれば、合格thisはそのようなハックではありません。

4

1 に答える 1

5

メソッドValidateEntityは、最初のパラメーターが型になるように宣言されていますT

あなたがそれをどのように呼んでいるのか見てみましょう:

var validationResults = this.ValidateEntity<T>(this, true).ToList();

あなたは暗黙的に変換しようとしていthisます-それTうまくいくと思う理由は何ですか?

私が電話したとします:

foo.Validate<string>();

これは、文字列への参照ではなく、 -の具体的なサブクラスのインスタンスへの参照であるため、 - をthis効果的に期待してメソッドに渡そうとします。stringthisEntityBase

于 2012-10-29T18:14:20.350 に答える