1

私は C# の Generics や Generics Constraint などに精通していますが、少なくともこれを見るまではそう思っていました。Fluent Validation Library でこのインターフェイスを見ていましたが、このコード行は何を意味するのでしょうか?

public interface IValidator<in T> : IValidator, IEnumerable<IValidationRule>, IEnumerable

特に<in T>コードのスニペット。

参照用の完全なインターフェイスを次に示します。( http://fluentvalidation.codeplex.com/SourceControl/latest#src/FluentValidation/IValidator.cs )

#region 

Assembly FluentValidation.dll, v4.0.30319

#endregion

using FluentValidation.Results;
using System.Collections;
using System.Collections.Generic;

namespace FluentValidation
{
    // Summary:
    //     Defines a validator for a particualr type.
    //
    // Type parameters:
    //   T:
    public interface IValidator<in T> : IValidator, IEnumerable<IValidationRule>, IEnumerable
    {
        // Summary:
        //     Sets the cascade mode for all rules within this validator.
        CascadeMode CascadeMode { get; set; }

        // Summary:
        //     Validates the specified instance.
        //
        // Parameters:
        //   instance:
        //     The instance to validate
        //
        // Returns:
        //     A ValidationResult object containing any validation failures.
        ValidationResult Validate(T instance);
    }
}
4

4 に答える 4

3

inキーワードを使用すると、反変パラメーターTとして定義されます。

反変型パラメーターを持つインターフェイスでは、そのメソッドは、インターフェイス型パラメーターで指定されたものよりも派生型が少ない引数を受け入れることができます

組み込みのデリゲートActionFunc. との入力パラメーターの型はAction反変Funcとして定義されています

MSDN の例:

interface IContravariant<in T> where T: class { }
class Sample<T> : IContravariant<T> { }

IContravariant<Object> iobj = new Sample<Object>();
IContravariant<String> istr = new Sample<String>();

// You can assign iobj to istr because 
// the IContravariant interface is contravariant.
istr = iobj; //compile successfully

T をcontra-vanriantとして定義しない場合、T はinvariantと呼ばれ、以下の代入はコンパイル エラーになります。

// In-variant interface. 
interface IInvariant<T> where T: class { }
class Sample<T> : IInvariant<T> where T: class { } 

IInvariant<object> iobj = new Sample<object>();
IInvariant<string> istr = new Sample<string>();

istr = iobj; // compile error

共変と反変の詳細については、こちらから

co-variant と contra-variant は、値型ではなく、参照型のみをサポートすることに注意してください。

于 2013-05-16T14:40:00.340 に答える
0

この型パラメーターがvariantであることを指定します。分散と反分散をチェックします。基本的には、宣言された型に加えて、このジェネリックに基づいてメソッドを作成するときに、宣言された型から派生した任意の型 (単語を使用する場合in)、または宣言された型が派生した任意の型も受け入れることをコンパイラに伝えます。 from, ( new キーワードを使用する場合out)

于 2013-05-16T14:41:11.830 に答える
0

in キーワードは、型パラメーターが反変であることを指定します。詳細については、以下のリンクにアクセスしてください。

http://msdn.microsoft.com/en-us/library/dd469484.aspx

于 2013-05-16T14:40:07.670 に答える
0

反変性は、特定のジェネリック型パラメーターに関連して適用され、in ジェネリック修飾子を使用しています。

http://www.codeproject.com/Articles/72467/C-4-0-Covariance-And-Contravariance-In-Generics

于 2013-05-16T14:38:12.043 に答える