【问题标题】:Syntax explanation, what does "in T" do / mean [duplicate]语法解释,“in T”是什么意思/意思[重复]
【发布时间】:2013-05-16 14:35:55
【问题描述】:

我熟悉 C# 中的泛型和泛型约束等,至少在我看到这个之前我是这么认为的。我在 Fluent Validation Library 中查看这个接口,它让我很震惊,这行代码是什么意思?

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

特别是&lt;in T&gt;sn-p 代码。

这是完整的界面供参考。 (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);
    }
}

【问题讨论】:

  • 当您在可能的第一行研究中将“C# generics in T”输入您喜欢的搜索引擎时,这些结果是否没有帮助?
  • 那你为什么不把这些词或类似的东西输入你喜欢的搜索引擎呢?请记住,我们希望您在提问之前进行自己的研究。否决工具提示文本开始为“此问题未显示任何研究工作。”

标签: c# generics


【解决方案1】:

使用in关键字,T被定义为反变体参数:

具有逆变类型参数的接口允许其方法接受比接口类型参数指定的派生类型更少的参数

如果您熟悉内置代理 Action 和 Func。 Action和Func的输入参数类型定义为contra-variant

来自 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

更多关于协变和反变的信息来自here

请注意co-variant and contra-variant only supports on reference type, not value type.

【讨论】:

  • 感谢您的链接和解释:)
【解决方案2】:

对特定的泛型类型强制执行逆变 参数,正在使用 in 泛型修饰符。

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

【讨论】:

    【解决方案3】:

    in 关键字指定类型参数是逆变的。 更多详情请点击以下链接。

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

    【讨论】:

      【解决方案4】:

      它指定这个类型参数是一个变体。检查variance and contravariance。基本上它告诉编译器在创建基于这个泛型的方法时,除了声明的类型之外,它还将接受任何派生 frpm 声明的类型的类型(如果它使用单词in),或者任何类型声明类型派生自,(如果它使用新关键字out)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-05
        • 2021-05-31
        • 2021-11-16
        • 2018-05-07
        • 2013-11-02
        • 2018-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多