泛型问题

3

我正在制作一个类,以便在扫雷游戏中作弊,目前正在建立一些通用模板...但我有点卡住了。我想返回一个整数,但如何进行转换呢?

public T ReadMemory<T>(uint adr)
{
    if( address != int.MinValue )
        if( typeof(T) == typeof(int) )
            return Convert.ChangeType(MemoryReader.ReadInt(adr), typeof(T));
        else
            MessageBox.Show("Unknown read type");
}

6
如果您一直使用 int ,为什么要使用泛型? - Tommy
你为什么要使用uint作为指针,而不是专门设计用于此的类型UIntPtr?或者说,为什么不使用指向int的指针? - Eric Lippert
为什么有两个变量,一个叫做“address”,另一个叫做“adr”?它们是指同一个东西吗?它们之间有什么区别? - Eric Lippert
如果您想从非托管的内存位置读取 int 而不使用不安全的代码,那么为什么不直接调用 Marshal.ReadInt32 呢? - Eric Lippert
3个回答

7

你需要将调用 ChangeType 的返回值进行转换

return (T)Convert.ChangeType(MemoryReader.ReadInt(adr), typeof(T)); 

1

尝试进行类型转换:

return (T)Convert.ChangeType(MemoryReader.ReadInt(adr), typeof(T));

1

我已经尝试修复编译器错误。但是我不知道这是否完全符合您的要求。

您必须将结果转换为T

return (T)Convert.ChangeType( MemoryReader.ReadInt( adr ), typeof( T ) );

当条件失败时,您必须返回一个值:

return default( T );

这将导致:

public T ReadMemory<T>( uint adr )
{
    if ( adr != int.MinValue )
    {
        if ( typeof( T ) == typeof( int ) )
        {
            return (T)Convert.ChangeType( MemoryReader.ReadInt( adr ), typeof( T ) );
        }
        else
        {
            System.Windows.Forms.MessageBox.Show( "Unknown read type" );
        }
    }
    return default( T );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接