C# 如何理解如下泛型约束 class A<T>:where T:class{}

如题

c#中一个类继承class是什么含义?

    public class A:class{
    }

更新

  1. 谢谢 @边城狂人 ,问题的由来是这样的,我在某个地方看到过一段代码,大体是:

        public class A<T> where T:class
        {
        }

    我将这个泛型约束理解成了普通的类继承,所以才提出上面错误的问题。

  2. @HSFZXJY 我不认为这是一个特别基础的问题,sf上不应该只是写高冷的文章和问答,基础的问题不应该被忽视。

  3. 问题重新修改为:如何理解泛型类的如下约束?

        public class A<T> where T:class
        {
        }
阅读 15.5k
4 个回答

泛型约束就好说了嘛,在泛型类型定义之后(class 中或者 method 中)使用 where 约束泛型类型,有点像继承的语法。

可以直接参考微软的类型参数的约束(C#编程指南)

约束 说明
where T: struct 类型参数必须是值类型。 可以指定除 Nullable 以外的任何值类型。 有关更多信息,请参见使用可以为 null 的类型(C# 编程指南)
where T : class 类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
where T : new() 类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。
where T : <base class name> 类型参数必须是指定的基类或派生自指定的基类。
where T : <interface name> 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。
where T : U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。

假設你有個類是長這樣:

class myClass<T> where T: Stream 

那麼你在實體化 new mayclass 時:

有效:

 new myClass<Stream>();

無效:

 new myClass<string>();

原因是你的條件約束了實體化時所傳入的類的型態需要實作Stream 這個類約束。
如果所傳入的是 string 在這邊就會發生錯誤。如果不讓它發生例外錯誤,就把 where T: Stream 拿掉就可以了。

肯定语法错误啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进