11

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

有人知道吗?

4

4 回答 4

28

它是对类型参数的约束,这意味着T赋予泛型类或方法的类型必须从该类继承。Attribute

例如:

public class Foo<T> : 
   where T : Attribute
{
    public string GetTypeId(T attr) { return attr.TypeId.ToString(); }
 // ..
}

Foo<DescriptionAttribute> bar; // OK, DescriptionAttribute inherits Attribute
Foo<int> baz; // Compiler error, int does not inherit Attribute

这很有用,因为它允许泛型类T在知道任何是 a 的对象T也必须是一个Attribute.

在上面的示例中,GetTypeId查询TypeIdof是可以的,attr因为TypeId是 an 的属性Attribute,并且因为attr是 aT它必须是继承自 的类型Attribute

约束也可以用于泛型方法,效果相同:

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

您可以对类型施加其他约束;来自MSDN

where T: struct

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

where T : class

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

where T : new()

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

where T : <base class name>

类型参数必须是或派生自指定的基类。

where T : <interface name>

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

where T : U

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

于 2009-03-07T18:30:18.220 回答
5

此外,其他人所说的,您也有以下内容:

  • new() - T 必须有默认构造函数
  • class - T 必须是引用类型
  • struct - T 必须是值类型
于 2009-03-07T18:33:14.593 回答
1

where子句用于限制使用泛型时可以传递的参数。创建泛型类时,根据您计划如何在类中使用 T 来指定参数类型可能符合您的最佳利益。如果它除了 System.Object 可以做的任何事情之外,那么最好使用约束,因为您将获得编译时错误与运行时错误。

例子

如果你创建一个类

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

您不能不传递任何不实现 IComparable 的类。因此,现在可以安全地对传递给 Person 类的任何内容使用 CompareTo。

于 2009-03-07T18:30:33.147 回答
1

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

where T : SomeType

意味着 T 必须要么从SomeType派生,要么实现接口SomeType

于 2009-03-07T18:31:09.870 回答