Вы не можете. Тем не менее, любое значение, которое вы хотите поместить в ref int
, можно в любом случае поместить в ref long
- вам просто нужно беспокоиться о начальном значении и о том, что вы хотите сделать, если оно выходит за пределы диапазона int
.
Сколько мест вам нужно записать в параметр ref или прочитать его в вашем коде? Если это только в одном или двух местах, у вас должно быть все в порядке, чтобы правильно разыграть в нужное время. В противном случае вы можете ввести новый метод:
public void Foo(ref int x)
{
// Here's the body I *really* want
}
public void Foo(ref long x)
{
// But I'm forced to use this signature for whatever
// reasons. Oh well. This hack isn't an *exact* mimic
// of ref behaviour, but it's close.
// TODO: Decide an overflow policy
int tmp = (int) x;
Foo(ref tmp);
x = tmp;
}
Причина, по которой я говорю в комментариях, что это не точная имитация поведения, заключается в том, что обычно изменения исходного параметра ref видны даже до возврата метода, но теперь они будут видны только в самом конце. Также, если метод выдает исключение, значение не будет изменено. Последний можно исправить с помощью try / finally, но это немного неуклюже. На самом деле, если вам нужно поведение try / finally, вы можете легко сделать все это одним методом:
public void Foo(ref long x)
{
int y = (int) x;
try
{
// Main body of code
}
finally
{
x = y;
}
}