Articles of genéricos

Melhor maneira de testar se um tipo genérico é uma string? (C #)

Eu tenho uma class genérica que deve permitir qualquer tipo, primitivo ou não. O único problema com isso é usar o default(T) . Quando você chama default em um tipo de valor ou em uma string, ele é inicializado em um valor razoável (como string vazia). Quando você chama default(T) em um object, ele retorna […]

Qual é a syntax de um construtor padrão para uma class genérica?

É proibido em c # implementar um construtor padrão para uma class genérica? Se não, por que o código abaixo não compila? (Quando eu removo ele compila embora) Qual é a maneira correta de definir um construtor padrão para uma class genérica? public class Cell { public Cell() { } } Erro de tempo de […]

Comparando um genérico com um nulo que poderia ser um valor ou tipo de referência?

public void DoFoo(T foo) where T : ISomeInterface { //possible compare of value type with ‘null’. if (foo == null) throw new ArgumentNullException(“foo”); } Eu estou propositadamente apenas verificando contra null porque eu não quero restringir um ValueType de ser igual ao seu default(T) . Meu código compila e funciona muito bem assim (ReSharper reclama, […]

ReSharper avisa: “campo estático no tipo genérico”

public class EnumRouteConstraint : IRouteConstraint where T : struct { private static readonly Lazy<HashSet> _enumNames; // <– static EnumRouteConstraint() { if (!typeof(T).IsEnum) { throw new ArgumentException(Resources.Error.EnumRouteConstraint.FormatWith(typeof(T).FullName)); } string[] names = Enum.GetNames(typeof(T)); _enumNames = new Lazy<HashSet>(() => new HashSet ( names.Select(name => name), StringComparer.InvariantCultureIgnoreCase )); } public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, […]

Como converter List para List

Como posso converter um List para List ? ( onde o SomethingElse é conhecido por descer do object ) Chatter de bônus Lançando a lista: List first = …; List second = (List)first; não funciona: Não é possível converter o tipo ‘System.Collections.Generic.List’ para ‘System.Collections.Generic.List’ Lançando a lista: List second = first.Cast(); não funciona: Não é […]

Linguagem C #: genéricos, abertos / fechados, ligados / não ligados, construídos

Eu estou lendo o livro “a linguagem de programação C #”, 4 ª edição, por Anders Hejlsberg etc. Existem várias definições que são um pouco distorcidas: Tipo genérico não ligado : Uma declaração de tipo genérico, por si só, indica um tipo genérico não ligado … tipo construído : Um tipo que inclui pelo menos […]

Diferença entre IEnumerable e IEnumerable ?

Qual é a diferença entre IEnumerable e IEnumerable ? Já vi muitas classs de frameworks implementando essas duas interfaces, portanto, gostaria de saber quais vantagens obter ao implementar as duas? Por favor, veja como eles foram definidos: public interface IEnumerable { [DispId(-4)] IEnumerator GetEnumerator(); } public interface IEnumerable : IEnumerable { IEnumerator GetEnumerator(); } Como […]

Repositório genérico – IRepository ou IRepository

Eu vi duas abordagens diferentes para criar repositorys genéricos. Quais são as diferenças entre essas duas abordagens (prós e contras)? Por favor, diregard diferença nos methods, porque eu estou interessado em diferença entre public interface IRepository where T : class e public interface IRepository : IDisposable Existe alguma diferença na funcionalidade, flexibilidade, teste de unidade […]

Boxe e unboxing com genéricos

A maneira do .NET 1.0 de criar uma coleção de inteiros (por exemplo) era: ArrayList list = new ArrayList(); list.Add(i); /* boxing */ int j = (int)list[0]; /* unboxing */ A penalidade de usar isso é a falta de segurança e desempenho do tipo devido ao boxe e unboxing. A maneira do .NET 2.0 é […]

Como, quando e onde os methods genéricos são concretizados?

Esta questão me fez pensar sobre onde a implementação concreta de um método genérico realmente existe. Eu tentei o google, mas não estou chegando com a pesquisa certa. Se tomarmos este exemplo simples: class Program { public static T GetDefault() { return default(T); } static void Main(string[] args) { int i = GetDefault(); double d […]