INT32和INT之间的通用方法差异
我在接口中理解通用方法时有问题。我将.NET Framework 4.8与自动C#版本一起使用,因此应该是C#7.3。下面的示例
接口是:
public interface IRegister
{
Nullable<T> Read<T>() where T: struct;
void Write<T>(T value) where T : struct;
}
现在一些从接口继承的类:
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;
}
}
现在我有一些从asstractregister继承的类:
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?;
}
}
在public public offride int中?读取&lt; int&gt;()
我有错误:
CS1001:预期标识符
CS1003:语法错误,'&gt;'预期
CS1003:语法错误,'('预期
我正在使用Visual Studio Community 2022
当我使用INT32而代替INT时,一切正常,它几乎可以解决我的问题,但是键入float(对我来说是必要的),没有float 。
我对解决这个问题的想法没有
I have problem with understanding generic method in interface. I'm using .NET framework 4.8 with auto C# version so it should be C# 7.3. Example below
Interface is:
public interface IRegister
{
Nullable<T> Read<T>() where T: struct;
void Write<T>(T value) where T : struct;
}
Now some class inherit from interface:
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;
}
}
Now I have some class inherited from 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?;
}
}
and in line public override int? Read<int>()
I have errors:
CS1001: Identifier expected
CS1003: Syntax error, '>' expected
CS1003: Syntax error, '(' expected
I'm using Visual Studio Community 2022
When I use Int32 instead int, everything works ok, and it almost resolve my problem, but type float (which is necessary for me) doesn't have Float representation.
I have no ideas for solving this problem anymore. Can someone explain it to me?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
也许尝试将界面更改为通用,这样,通用类型的引用被限制为相同类型的类型,而不仅仅是任意任何类型:
此处的功能差异是在类级别指定通用类型,基本类中的所有T都必须相同,因此对于
inputegrregister_int
所有T a a a a re re re Now re Now re Now re now code> intint < /代码>。
从语法的角度来看,请注意,该方法没有其原型上的后缀,这是因为它们根本不是通用方法,它们被专门键入相同的类型参数时指定的时创建了实例。
如果您确实有这样的方法:
即使到
inputregister_int
类,我们可以通过 任何 struct类型的struct类型,并期望它返回值,以下值期望在运行时有效:如果您确实希望您的寄存器是任何任意类型,那么我们真的不需要摘要注册:
但是这导致了非常懒惰的实现,modbus寄存器中的值类型不会改变,大多数固定在硬件实现中,但是PLC中的内部逻辑会为您避免使用类型。您的固定类型
inputRegister_int
允许您在需要时进行特定值并输入访问响应的检查,并有助于指导开发人员以后做出合理的决定。Perhaps try changing the interface to being generic, that way the generic type references are constrained to being of the same type, and not just arbitrarily any type:
The functional difference here is that specifying the generic type at the class level, all of the T's in the base class MUST be the same so for
InputRegister_int
all the T's a re nowint
.From a syntax perspective, notice that the methods DO NOT have the suffix on their prototypes, this is because they are not generic methods at all, they are specifically typed to the same type parameter that was specified when the instance was created.
If you did have a method like this:
Then even to the
InputRegister_int
class we could pass through ANY type of struct to that method and expect it to return the value, the following would be expected to be valid at runtime:If you really do want your register to be any arbitrary type, then we don't really need an abstract register at all:
However this leads to a very lazy implementation, the types of the values in your ModBus registers are not going to change, most are fixed to hardware implementations but the internal logic in the PLC will contrain the types for you. Your fixed type
InputRegister_int
allows you do to specific value and type checking on the response from the client when you need to and it helps guide the developers to make reasonable decisions later.此答案是关于“ int32”与
int
的一部分问题的专门的。int32
在代码中用作“此作品”的示例实际上不是system.int32
(这正是int
is),而只是只是的名称恰好匹配某些系统类型的名称。下面的代码显示了更简单的示例 - 您可以看到“ int32”的行为与其他不是类型名称的字符串完全相同。
通用方法中类型参数的常规名称以
t
开始(只有t
或以其为前缀 -tresult
),但是C#中有规则实施这一点的规范。结果,只要在正确的位置中使用void m&lt; nothythatisnottype&gt;(...)
,任何不现有类型名称的任何现有类型名称被视为“类型参数的名称”。This answer is specifically about "Int32" vs.
int
part of the question.Int32
used in the code as example of "this works" is not actuallySystem.Int32
(which is exactly whatint
is) but rather just a name that happen to match name of some system type.Code below shows simpler example of this - you can see that "Int32" behaves exactly as any other string that is not a type name.
Conventionally name of the type parameter in generic method starts with
T
(justT
or prefixed with it -TResult
), but there is rule in C# specification that enforces that. As result anything that is not existing type name is considered "name of the type parameter" as long as it is used in the right placevoid M<AnythingThatIsNotType>(...)
.