.net - Contratos de código: ¿cómo proporciono una clase de contrato para una interfaz genérica?
generics interface (2)
Me gustaría especificar un contrato para esta interfaz genérica, utilizando Contratos de código:
interface IRandomWriteAccessible<T>
{
T this[uint index] { set; }
uint Length { get; }
}
La documentación dice que use el atributo ContractClass
al especificar un contrato para una interfaz. Sin embargo, el compilador se quejará de esto:
[ContractClass(typeof(IRandomWriteAccessibleContract<T>))]
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <-- compiler error
interface IRandomWriteAccessible<T> { … }
[ContractClassFor(typeof(IRandomWriteAccessible<T>))]
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <-- compiler error
sealed class IRandomWriteAccessibleContract<T> : IRandomWriteAccessible<T> { … }
Parece que los parámetros de tipo no se pueden usar con atributos.
¿Cómo escribo un contrato para mi interfaz genérica? ¿O esto no es posible con los Contratos de Código?
Buena pregunta, pero puede ver las razones técnicas detrás de esta limitación, ¿verdad?
La razón por la que no puede especificar ContractClass es porque Blah<T>
no es una clase.
Si puede hacer una interfaz para una clase concreta especificando un valor para T
, aunque estoy seguro de que esto no es óptimo.
Como se menciona en otros comentarios en esta pregunta, debe eliminar el identificador de tipo genérico del uso de su atributo, ya que no se puede resolver en tiempo de compilación:
[ContractClass(typeof(IRandomWriteAccessibleContract<>))]