“哪里T:somevalue”是什么意思?

where T : somevalue意味着什么? 我刚看到一些代码说where T : Attribute 。 我认为这与generics有关,但我不确定这意味着什么或它在做什么。

有人知道吗?

它是对类型参数约束 ,这意味着赋予generics类或方法的类型T必须从类Attributeinheritance

例如:

 public class Foo : where T : Attribute { public string GetTypeId(T attr) { return attr.TypeId.ToString(); } // .. } Foo bar; // OK, DescriptionAttribute inherits Attribute Foo baz; // Compiler error, int does not inherit Attribute 

这很有用,因为它允许generics类使用类型为T对象执行操作,同时知道任何属于T东西也必须是Attribute

在上面的示例中, GetTypeId可以查询attrTypeId ,因为TypeIdAttribute ,并且因为attrT所以它必须是从Attributeinheritance的类型。

约束也可以用于generics方法,具有相同的效果:

 public static void GetTypeId(T attr) where T : Attribute { return attr.TypeId.ToString(); } 

您可以对类型进行其他限制; 来自MSDN :

where T: struct

type参数必须是值类型。 可以指定除Nullable之外的任何值类型。

where T : class

type参数必须是引用类型; 这也适用于任何类,接口,委托或数组类型。

where T : new()

type参数必须具有公共无参数构造函数。 与其他约束一起使用时,必须最后指定new()约束。

where T :

type参数必须是或从指定的基类派生。

where T :

type参数必须是或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是通用的。

where T : U

为T提供的类型参数必须是或者从为U提供的参数派生。这称为裸类型约束。

此外,其他人说,你也有以下内容:

  • new() – T必须具有默认构造函数
  • class – T必须是引用类型
  • struct – T必须是值类型

这是一种限制用作generics参数的类型的方法。 所以:

 where T : SomeType 

意味着T必须从SomeType派生或实现接口SomeType

where子句用于限制使用generics时可以传递的参数。 在创建generics类时,根据您计划在类中使用T的方式指定参数类型可能符合您的最佳利益。 除了System.Object可以做的任何事情之外,最好使用约束,因为你会得到编译时错误和运行时。

如果你创建一个类

 class Person where T : System.IComparable { //can now use CompareTo } 

你不能不传递任何没有实现IComparable的类。 所以现在可以安全地在传递给Person类的任何东西上使用CompareTo。