2010-03-17 2 views

ответ

70

Это не может быть сделано 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); 
} 
+23

Причина: все аргументы общего типа должны быть такими, которые являются conv применимый к объекту. «ref float» не конвертируется в объект, поэтому вы не можете использовать его как аргумент общего типа. –

+1

Спасибо за это, я изо всех сил пытался использовать Func, поэтому я знаю, почему я не могу использовать его, когда тип не конвертируется в объект. – chugh97

+0

Означает ли это, что для делегирования делегатов в этом случае потребуется бокс/распаковка? –

5

В .NET 4+ можно также поддерживать ref типов этот путь ...

public delegate bool MyFuncExtension<in string, MyRefType, out Boolean>(string input, ref MyRefType refType); 
+1

Не воскрешать мертвую нить, но это обязательно должно быть отмечено для всех, кто сталкивается с этим, что, хотя вы можете поддерживать ref param с помощью дженериков таким образом, параметр типового типа будет инвариантным. Параметры общего типа не поддерживают дисперсию (ковариацию или контравариантность) для параметров ref или out в C#. Все равно прекрасно, если вам не нужно беспокоиться о неявных преобразованиях типов. –

+2

Извините, этот ответ немного не в порядке. «In» и «out», которые вы показываете для параметризации делегата, относятся к «противоречивости» и не связаны с тем, о чем спрашивает OP. Вопрос касался делегатов, которые могут принимать параметры по ссылке, а не гибкость (общего) делегата в отношении его параметризации. –