【问题标题】:interface<T> where T : class [duplicate]interface<T> where T : 类 [重复]
【发布时间】:2014-02-14 19:56:53
【问题描述】:
interface<T> where T : class

例如

public interface iSend<T> where T : class

上面的代码是什么意思?

为什么要使用这个?

什么时候用这个?

【问题讨论】:

标签: c# generics


【解决方案1】:

在这里查看我的完整帖子:Constrain on custom generic type,其中讨论了不同类型的通用约束

它是引用类型约束

约束确保类型参数是引用类型。即类、接口、委托、数组等。

interface iSend<T> where T : class

例子

Valid             InValid
A<MyClass>        A<int>
A<InterfaceME>    A<float>   
A<float[]>  

注意: 应用多个约束时始终排在第一位。

【讨论】:

    【解决方案2】:

    来自docs

    类型参数的约束

    当您定义一个泛型类时,您可以对客户端代码在实例化您的类时可用于类型参数的类型类型施加限制。如果客户端代码尝试使用约束不允许的类型来实例化您的类,则结果是编译时错误。这些限制称为约束。
    ...
    where T : class:类型参数必须是引用类型;这也适用于任何类、接口、委托或数组类型。

    如果你使用这个约束,那么T 必须是一个引用类型(并且没有值类型)。

    你这样做,例如能够使用null,因为引用类型可以是null,而值类型不能。

    【讨论】:

      【解决方案3】:

      有所谓的泛型类型约束。

      上面的代码意味着,你有一个通用接口iSend,它只需要一个引用类型作为类型参数

      当您想将iSend 的类型参数限制为引用类型时

      【讨论】:

      • 为什么要使用这个?什么时候用这个?
      • @MARKANDBhatt 我没有适用于接口的示例,您可能希望限制引用类型的某些情况是:当您依赖 ReferenceEquals 时,当您使用弱引用时,或者当您希望能够对复杂类型进行原子读取或写入。也可以说泛型类型的变量应该可以为空。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多