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