public object MethodName(ref float y)
{
//method
}
Как определить делегат Func для этого метода?Func delegate with ref variable
public object MethodName(ref float y)
{
//method
}
Как определить делегат Func для этого метода?Func delegate with ref variable
Это не может быть сделано Func
, но вы можете определить пользовательские delegate
для него: пример
public delegate object MethodNameDelegate(ref float y);
Использование:
public object MethodWithRefFloat(ref float y)
{
return null;
}
public void MethodCallThroughDelegate()
{
MethodNameDelegate myDelegate = MethodWithRefFloat;
float y = 0;
myDelegate(ref y);
}
В .NET 4+ можно также поддерживать ref
типов этот путь ...
public delegate bool MyFuncExtension<in string, MyRefType, out Boolean>(string input, ref MyRefType refType);
Не воскрешать мертвую нить, но это обязательно должно быть отмечено для всех, кто сталкивается с этим, что, хотя вы можете поддерживать ref param с помощью дженериков таким образом, параметр типового типа будет инвариантным. Параметры общего типа не поддерживают дисперсию (ковариацию или контравариантность) для параметров ref или out в C#. Все равно прекрасно, если вам не нужно беспокоиться о неявных преобразованиях типов. –
Извините, этот ответ немного не в порядке. «In» и «out», которые вы показываете для параметризации делегата, относятся к «противоречивости» и не связаны с тем, о чем спрашивает OP. Вопрос касался делегатов, которые могут принимать параметры по ссылке, а не гибкость (общего) делегата в отношении его параметризации. –
Причина: все аргументы общего типа должны быть такими, которые являются conv применимый к объекту. «ref float» не конвертируется в объект, поэтому вы не можете использовать его как аргумент общего типа. –
Спасибо за это, я изо всех сил пытался использовать Func, поэтому я знаю, почему я не могу использовать его, когда тип не конвертируется в объект. – chugh97
Означает ли это, что для делегирования делегатов в этом случае потребуется бокс/распаковка? –