是什么where T : somevalue
意思?我刚刚看到一些代码说where T : Attribute
。我认为这与泛型有关,但我不确定这意味着什么或它在做什么。
有人知道吗?
是什么where T : somevalue
意思?我刚刚看到一些代码说where T : Attribute
。我认为这与泛型有关,但我不确定这意味着什么或它在做什么。
有人知道吗?
它是对类型参数的约束,这意味着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
查询TypeId
of是可以的,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 提供的参数。这称为裸类型约束。
此外,其他人所说的,您也有以下内容:
where子句用于限制使用泛型时可以传递的参数。创建泛型类时,根据您计划如何在类中使用 T 来指定参数类型可能符合您的最佳利益。如果它除了 System.Object 可以做的任何事情之外,那么最好使用约束,因为您将获得编译时错误与运行时错误。
例子
如果你创建一个类
class Person<T> where T : System.IComparable<T>
{
//can now use CompareTo
}
您不能不传递任何不实现 IComparable 的类。因此,现在可以安全地对传递给 Person 类的任何内容使用 CompareTo。
这是一种限制用作泛型参数的类型的方法。所以:
where T : SomeType
意味着 T 必须要么从SomeType派生,要么实现接口SomeType