What does “where T : somevalue” mean?

前端 未结 4 1247
暖寄归人
暖寄归人 2021-02-05 22:14

What does where T : somevalue mean? I just saw some code that said where T : Attribute. I think this has something to do with generics but I am not sur

4条回答
  •  余生分开走
    2021-02-05 22:44

    It is a constraint on a type parameter, meaning that the type T given to a generic class or method must inherit from the class Attribute

    For example:

    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
    

    This is useful, because it allows the generic class to do things with objects of type T with the knowledge that anything that is a T must also be an Attribute.

    In the example above, it's okay for GetTypeId to query the TypeId of attr because TypeId is a property of an Attribute, and because attr is a T it must be a type that inherits from Attribute.

    Constraints can also be used on generic methods, with the same effect:

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

    There are other constraints you can place on a type; from MSDN:

    where T: struct

    The type argument must be a value type. Any value type except Nullable can be specified.

    where T : class

    The type argument must be a reference type; this applies also to any class, interface, delegate, or array type.

    where T : new()

    The type argument must have a public parameterless constructor. When used together with other constraints, the new() constraint must be specified last.

    where T :

    The type argument must be or derive from the specified base class.

    where T :

    The type argument must be or implement the specified interface. Multiple interface constraints can be specified. The constraining interface can also be generic.

    where T : U

    The type argument supplied for T must be or derive from the argument supplied for U. This is called a naked type constraint.

提交回复
热议问题