Проблема с обобщениями

#c# #generics

#c# #дженерики

Вопрос:

Я создаю класс, чтобы я мог обманывать в minesweeper, и в настоящее время создаю несколько дженериков… но я вроде как застрял. Я хочу вернуть значение int, но как мне его преобразовать?

 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");
}
  

Комментарии:

1. Почему вы хотите использовать дженерики, если вы хотите всегда использовать int?

2. Почему вы используете uint в качестве указателя вместо типа, специально предназначенного для этого, UIntPtr ? Или, если уж на то пошло, почему бы не использовать указатель на int ?

3. Почему существуют две переменные, одна из которых называется «address», а другая — «adr»? они должны быть одинаковыми? В чем разница между ними?

4. И если вы хотите прочитать int из неуправляемой ячейки памяти без использования небезопасного кода, то почему бы вам просто не вызвать Marshal. ReadInt32?

Ответ №1:

Вам нужно преобразовать возвращаемое значение из вызова в ChangeType

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

Ответ №2:

Попробуйте кастинг:

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

Ответ №3:

Я попытался исправить ошибки компилятора. Но я не знаю, это именно то, что вы ищете.

Вы должны преобразовать результат в 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 );
}