Pergunta

O que where T : somevalue média? Eu só vi alguns códigos que disse where T : Attribute. Eu acho que isso tem algo a ver com os genéricos, mas eu não tenho certeza o que isso significa ou o que está fazendo.

Alguém sabe?

Foi útil?

Solução

É um restrição em um parâmetro de tipo , o que significa que o T tipo dado a uma classe genérica ou método deve herdar da classe Attribute

Por exemplo:

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

Isso é útil, porque permite que a classe genérica de fazer coisas com objetos do tipo T com o conhecimento de que qualquer coisa que é um T também deve ser um Attribute.

No exemplo acima, está tudo bem para GetTypeId para consultar o TypeId de attr porque TypeId é uma propriedade de um Attribute, e porque attr é um T ele deve ser um tipo que herda de Attribute.

As restrições podem também ser usados ??em métodos genéricos, com o mesmo efeito:

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

Há outras restrições que você pode colocar em um tipo; de MSDN :

where T: struct

O argumento do tipo deve ser um valor tipo. Qualquer tipo de valor, exceto Nullable pode ser especificada.

where T : class

O argumento do tipo deve ser uma referência tipo; isso se aplica também a qualquer classe, interface, delegado, ou tipo de matriz.

where T : new()

O argumento do tipo deve ter um público construtor sem parâmetros. Quando usado em conjunto com outras restrições, o nova restrição () deve ser especificado passado.

where T : <base class name>

O argumento do tipo deve ser ou derivar da classe base especificado.

where T : <interface name>

O argumento do tipo deve ser ou implementar a interface especificada. Múltiplo restrições de interface pode ser Especificadas. A interface restringindo também pode ser genérica.

where T : U

O argumento tipo fornecido para T deve ser ou derivar a partir do argumento fornecido para U. Isso é chamado de um nu tipo de restrição.

Outras dicas

Além disso o que os outros disseram, você tem o seguinte demasiado:

  • new () - T deve ter construtor padrão
  • classe - T deve ser um tipo de referência
  • struct - T deve ser um tipo de valor

É uma forma de restringir o tipo usado como argumentos genéricos. Assim:

where T : SomeType

Meios que T deve ou derivar de SomeType ou implementar a interface SomeType

O onde cláusula é usada para limitar os argumentos que podem ser passadas ao usar os genéricos. Quando você cria uma classe genérica que poderia ser de seu interesse para especificar um tipo de argumento, dependendo de como você pretende usar o T na sua classe. Se qualquer coisa além do que System.Object pode fazer, então provavelmente é melhor usar um restrição como você receberá um erro de tempo de compilação vs um tempo de execução.

exemplo

Se você criar uma classe

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

Você não pode deixar passar esta classe qualquer coisa que não implementa IComparable. Por isso, é agora seguro para usar CompareTo em qualquer coisa que é passado para a classe Person.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top