I need to implement an interface like this:
interface IEvent<T> : IEvent { T Data { get; } } public interface IEvent { Guid Id { get; set; } long Version { get; set; } long Sequence { get; set; } object Data { get; } Guid StreamId { get; set; } string StreamKey { get; set; } DateTimeOffset Timestamp { get; set; } string TenantId { get; set; } Type EventType { get; } string EventTypeName { get; set; } string DotNetTypeName { get; set; } } That's what I came up with:
type WrappedEvent<'T>(x: 'T) = interface Events.IEvent with member val Data = x with get member val DotNetTypeName = null with get, set member val EventType = null member val EventTypeName = null with get, set member val Id = Guid.Empty with get, set member val Sequence = int64 (0) with get, set member val StreamId = Guid.Empty with get, set member val StreamKey = null with get, set member val TenantId = null with get, set member val Timestamp = DateTimeOffset.MinValue with get, set member val Version = int64 (0) with get, set WrappedEvent is used like this:
let MapToSubtype subtype = match subtype with | CustomerRegistered registeredCustomer -> WrappedEvent<CustomerRegisteredEvent> registeredCustomer :> Events.IEvent | CustomerDeleted deletedCustomer -> WrappedEvent<CustomerDeletedEvent> deletedCustomer :> Events.IEvent The compiler throws an error for <'T> at WrappedEvent<'T>
This type parameter has been used in a way that constrains it to always be 'obj' This code is less generic than required by its annotations because the explicit type variable 'T' could not be generalized. It was constrained to be 'obj'. A warning is shown for Data at member val Data:
This construct causes code to be less generic than indicated by the type annotations. The type variable 'T has been constrained to be type 'obj'. How do I solve this?
Update:
If I'm implementing the interface like this interface Events.IEvent<'T> with (using the generic parameter), I get this error:
No implementation was given for 'Events.IEvent.get_Data() : obj'. Note that all interface members must be implemented and listed under an appropriate 'interface' declaration, e.g. 'interface ... with member ...'.
IEvent, but not generic? That's a common pattern from the early days of .NETinterface Events.IEvent<'T> with?IEvent<T>at all, right? Wasn't that the goal?interface Events.IEvent<'T> withand now I get the errorNo implementation was given for 'Events.IEvent.get_Data() : obj'.