Tengo la siguiente definición de interfaz
public interface IEncryptor { T Decrypt<T>(byte[] encryptedData) where T : class; }con esta implementación (que no debería ser relevante)
internal class ThingyEncryptor : IEncryptor { public T Decrypt<T>(byte[] encryptedData) where T : class { var encryptedSymmetricKey = encryptedData.Take(SymmetricKeyLength).ToArray(); var iv = encryptedData.Skip(SymmetricKeyLength).Take(IvLength).ToArray(); var symmetricEncryptedData = encryptedData.Skip(SymmetricKeyLength + IvLength).ToArray(); using (var rsa = _certificate.GetRSAPrivateKey()) { var symmetricKey = rsa.Decrypt(encryptedSymmetricKey, RSAEncryptionPadding.Pkcs1); var clearData = Decrypt(symmetricEncryptedData, symmetricKey, iv); return JsonConvert.DeserializeObject<T>(Encoding.UTF8.GetString(clearData)); } } }Al leer Restricciones en los parámetros de tipo (Guía de programación de C#) , se afirma:
Si el código del cliente usa un tipo que no satisface una restricción, el compilador emite un error
No puedo ver ninguna advertencia o error del compilador cuando llamo al método Decrypt de esta manera (donde IMyModel es realmente una interfaz y NO una clase):
_encryptor.Decrypt<IMyModel>(x.Patient)¿Por qué?
Este código es parte de un proyecto nestandard20.
Está malinterpretando la restricción de class , obliga a que el argumento de tipo proporcionado sea un tipo de referencia:
El argumento de tipo debe ser un tipo de referencia. Esta restricción también se aplica a cualquier clase, interfaz , delegado o tipo de matriz.