public class MyClass : ISelfReferenceable<Guid> { public Guid Id {get;set;} public Guid? ParentId {get;set;} } public interface ISelfReferenceable<TId> { TId Id {get;set;} TId? ParentId {get;set;} }¿Alguien puede explicarme por qué lo anterior no funciona?
Grita Error del compilador CS0738
'nombre de tipo' no implementa el miembro de interfaz 'nombre de miembro'. 'nombre de método' no puede implementar 'miembro de interfaz' porque no tiene el tipo de retorno coincidente de 'nombre de tipo'.
en MyClass.ParentId , diciendo que no implementa ISelfReferenceable.ParentId , a menos que cambie MyClass.ParentId de Guid? a Guid .
Actualmente, soluciono esto usando dos tipos genéricos, uno para Id y otro para ParentId , o simplemente hago ParentId Guid en lugar de Guid? .
¿Es este el enfoque correcto y hay una mejor manera de hacerlo?
No sé si se adapta a su propósito, pero se compila con esto:
public interface ISelfReferenceable<TId> where TId : struct { TId Id {get;set;} TId? ParentId {get;set;} } Recuerde que Guid es un tipo de valor.
El problema es que TId? se interpreta como un tipo de referencia anulable (de hecho, esto es más complicado y depende de la versión del idioma y de si se encuentra en un contexto anulable. Consulte también la explicación en la restricción predeterminada ) . Puede solucionarlo agregando una restricción de tipo genérico where TId : struct a la interfaz. Pero, por supuesto, esto limita los tipos aplicables a los tipos de valor. Un ID string no sería posible.
El error también desaparece si declaras
public class MyClass : ISelfReferenceable<string> { public string Id { get; set; } public string? ParentId { get; set; } }