c# - 在点网中不可能适用于 int 和 uint 的通用方法吗?

标签 c# generics

<分区>

在 C# 中,不可能有一个适用于 int 和 uint 的泛型方法,因为泛型类型必须是一个类而不是原始类型,或者这只是在约束条件下吗?

public decimal shift<T>(T input, byte b) where T : int, uint
{
   ///....
}

有什么方法可以不受限制地进行这项工作吗?

public decimal shift<T>(T input, byte b)  
{
   ///....
}

当我执行后者时,我得到了进一步的结果,但在对 int 或 uint 进行移位操作时仍然出错。就好像,它在运行时不知道它是什么类型。

最佳答案

在 C# 中,为 native 类型编写特殊情况通常是通过方法重载完成的。在 BCL 中有几个地方可以看到这种设计,一个例子是 BitConverter类。

如果您想要一个具有一些特殊情况的泛型版本,您可以添加一个泛型重载,C# 的类型推断将使其对最终用户透明。

public decimal shift(int input, byte b)
{
    //....
}

public decimal shift(uint input, byte b)
{
    //....
}

public decimal shift<T>(T input, byte b)
{
    //....
}

用法:

shift(5, 1); //resolves to the 'int'overload
shift(5u, 1); //resolves to the 'uint' overload
shift(new Point(2, 2), 1) //resolves to the generic overload with T = Point

我猜您正在尝试使用通用方法进行位移。只有少数几种类型(byte、sbyte、short、ushort、int、uint、long、ulong)是有意义的,因此您最好只写出 8 个重载。我在我的一个项目中有一门课,其中包含很多位黑客,我只是写出了必要的重载,而且效果很好。

关于c# - 在点网中不可能适用于 int 和 uint 的通用方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17417302/

相关文章:

c# - .NET 应用程序有时会在应用程序启动时崩溃(无法访问 .exe)

c# - 使用 StructureMap 注册通用工厂的方法

java - Java 删除如何影响通用数组?

c# - asp.net c# asp :TextBox, 如何去掉cols和rows属性?

c# - 将控制台中显示的所有数据输出到.txt 文件

C# 捕获异常

C# 强制转换为通用接口(interface)中的对象

c# - 创建泛型类的泛型工厂

delphi - 如何确定 IInterface 后代是否具有属性?

c# - 另一种通过在构造函数中注入(inject)基类来实例化派生类的基类部分的方法?