Tengo problemas para entender el método genérico en la interfaz. Estoy usando .NET Framework 4.8 con la versión automática de C#, por lo que debería ser C# 7.3. Ejemplo a continuación
La interfaz es:
public interface IRegister { Nullable<T> Read<T>() where T: struct; void Write<T>(T value) where T : struct; }Ahora alguna clase hereda de la interfaz:
public abstract class AbstractRegister : IRegister { protected ModbusClient client; protected int Address; public abstract Nullable<T> Read<T>() where T : struct; public virtual void Write<T>(T value) where T : struct { return; } public AbstractRegister(int address, ModbusClient client) { this.client = client; this.Address = address; } }Ahora tengo una clase heredada de AbstractRegister:
class InputRegister_int : AbstractRegister { public InputRegister_int(int address, ModbusClient client) : base(address, client) { } public override int? Read<int>() { if (client == null) return null; return this.client.ReadInputRegisters(this.Address, 1)[0] as int?; } } y en línea public override int? Read<int>() Tengo errores:
CS1001: Identificador esperado
CS1003: error de sintaxis, se esperaba '>'
CS1003: error de sintaxis, se esperaba '('
Estoy usando Visual Studio Community 2022
Cuando uso Int32 en lugar de int, todo funciona bien y casi resuelve mi problema, pero el tipo float (que es necesario para mí) no tiene representación Float.
Ya no tengo ideas para resolver este problema. ¿Alguien puede explicar me lo?
Esta respuesta es específicamente sobre "Int32" vs. int parte de la pregunta.
Int32 utilizado en el código como ejemplo de "esto funciona" no es en realidad System.Int32 (que es exactamente lo que es int ), sino simplemente un nombre que coincide con el nombre de algún tipo de sistema.
El siguiente código muestra un ejemplo más simple de esto: puede ver que "Int32" se comporta exactamente como cualquier otra cadena que no sea un nombre de tipo.
using System; public class SomeClass { // exactly the same as T X<T>(), just using `Int32` as type parameter name Int32 X<Int32>() { return default(Int32); } // fails to compile as `System.Int32` and `int` are concrete types System.Int32 Y<System.Int32>() { return default(System.Int32); } int X<int>() { return default(int); } } Convencionalmente, el nombre del parámetro de tipo en el método genérico comienza con T (solo T o tiene el prefijo TResult ), pero hay una regla en la especificación de C# que lo impone. Como resultado, cualquier cosa que no sea un nombre de tipo existente se considera "nombre del parámetro de tipo" siempre que se use en el lugar correcto void M<AnythingThatIsNotType>(...) .