C# 泛型类无法隐式转换类型';T';至';Int';

C# 泛型类无法隐式转换类型';T';至';Int';,c#,C#,我创建了一个泛型接口类,并用另一个泛型类继承它。 编译器不喜欢我的函数(请参阅代码中的错误) 我错过了什么 我想从ChecksumTruncate12Bit创建类型为ushort、uint和ulong的对象 public interface IChecksum<T> { T Checksum(byte[] buffer, int size); } public class ChecksumTruncate12Bit<T> : IChecksum<T>

我创建了一个泛型接口类,并用另一个泛型类继承它。 编译器不喜欢我的函数(请参阅代码中的错误)

我错过了什么

我想从ChecksumTruncate12Bit创建类型为ushort、uint和ulong的对象

public interface IChecksum<T>
{
    T Checksum(byte[] buffer, int size);
}

public class ChecksumTruncate12Bit<T> : IChecksum<T>
{
    public T Checksum(byte[] buffer, int size)
    {
        T rv = (T)0; // Error CS0030 Cannot convert type 'int' to 'T'

        for (int i = 0; i < size; ++i)
        {
            rv += (T)(buffer[i]); // Error CS0030 Cannot convert type 'byte' to 'T'
            rv &= (T)(0x0FFF); // Error CS0030 Cannot convert type 'int' to 'T'
        }

        return rv;
    }
}
公共接口IChecksum
{
T校验和(字节[]缓冲区,整数大小);
}
公共类checksum截断12位:IChecksum
{
公共T校验和(字节[]缓冲区,整数大小)
{
T rv=(T)0;//错误CS0030无法将类型“int”转换为“T”
对于(int i=0;i
将您的
检查集TRUNCATE12BIT
本身设置为通用性是没有意义的(也不可能)。它仍然可以实现您的通用接口,只需要指定类型-在本例中
uint

public class ChecksumTruncate12BitUint : IChecksum<uint> 
{
    public uint Checksum(byte[] buffer, int size)
    {
        uint rv = 0; 

        for (int i = 0; i < size; ++i)
        {
            rv += (uint)(buffer[i]); 
            rv &= (uint)(0x0FFF); 
        }

        return rv;
    }
}
公共类checksum truncate12bituint:IChecksum
{
公共uint校验和(字节[]缓冲区,整数大小)
{
uint-rv=0;
对于(int i=0;i

您可以分别为
ushort
ulong

实现。您必须明确地指定泛型类型参数well,错误说明了这一切。如果我创建了一个名为
Car
的类,并在您的类中使用它,您希望在这里发生什么:
carrv=(Car)0C#没有任何通用数字。你必须选择一种类型并坚持下去。您可以使用
default(T)
来替换
(T)0
,但转换、加法和按位运算符之类的内容无法使用通用约束捕获。