Es difícil de decir dado que solo ha dado dos declaraciones, no cómo las está usando. ¿Es IdT otro parámetro de tipo en alguna parte? (Si fuera TId
, eso sugeriría que es - pero el hecho de que está utilizando EntityT
para otro tipo de parámetro, en contra de las convenciones, sugiere que tal vez IdT
es así ...)
Ahora, suponiendo que es IdT
De hecho, Guid
en su caso, ¿cómo debería funcionar el compilador que quiere decir Foo
? Puede haber otros tipos derivados de EntityObject<Guid>
.
En resumen, no nos ha dado suficiente información para contar algo con certeza, pero parece que básicamente está haciendo demandas irracionales al compilador.
EDIT: Bueno, aquí está mi suposición de lo que tienes, usando convenciones de nombres normales:
public interface IRepository
{
TEntity Get<TEntity, TId>(TId id) where TEntity : EntityObject<TId>
}
public abstract class EntityObject<TId>
{
public IdT id { get; set; }
}
public class Foo : EntityObject<Guid> {}
Se desea realizar:
IRepository repository = GetRepositoryFromSomewhere();
Foo foo = repository.Get<Foo>(someGuid);
Mientras que actualmente hay que hacer:
Foo foo = repository.Get<Foo, Guid>(someGuid);
Sí, el compilador lo está haciendo muy ligeramente más difícil para ti de lo necesario. Un total de 6 caracteres adicionales, con el objetivo de mantener el lenguaje más simple y las reglas de tipo de inferencia más fáciles de entender.
Básicamente, la inferencia de tipo es un asunto de todo o nada: todos los parámetros de tipo se deducen o ninguno de ellos. Eso lo mantiene simple ya que no necesita determinar cuáles se especifican y cuáles no. Eso es parte del problema, y la otra parte es que sólo se puede expresar restricciones sobre los parámetros de tipo del método - no se puede tener:
class Repository<TEntity>
{
TEntity Get<TId>(TId id) where TEntity : EntityObject<TId>
}
porque eso limitando TEntity
, no TId
. De nuevo, este tipo de cosas hace que la inferencia de tipos sea más simple.
Ahora podría potencialmente escribir:
Foo foo = repository.Get(someGuid).For<Foo>();
con un método apropiado Get
y una interfaz adicional. Creo que personalmente preferiría simplemente usar Get<Foo, Guid>
.
Jon, me disculpo por no agregar más detalles. De nuevo, esto fue más una farsa que una verdadera pregunta legítima. Pero en el caso de que el compilador sea capaz de determinar IdT desde el objeto foo en tiempo de compilación. Lo más probable es que mis suposiciones genéricas me lleven a una interpretación errónea de cómo el compilador podría/debería leer esto, pero asumí que el tipo genérico no se determinó hasta el momento de la compilación, momento en el que el compilador vincularía el objeto con plantilla Suponiendo que, ¿no sería un paso más para determinar el tipo de objeto al que se hace referencia? – Raspar
Generics! = Plantillas. Probablemente puedas obtener un compilador de C++ para "inferir" ese tipo de cosas, pero mientras los genéricos sean tiempo de ejecución, no veo que suceda sin una definición genérica más explícita. – user7116
IdT no es un parámetro de tipo de 'Get', que solo tiene un parámetro de tipo,' EntityT'. No ha proporcionado la declaración de IRepository, o lo que no funciona para usted. Proporcione un ejemplo * completo *, que muestre lo que * intenta * hacer y díganos qué sucede en lugar de lo que desea. –