2010-03-17 58 views

Trả lời

70

Nó không thể được thực hiện bằng cách Func nhưng bạn có thể xác định một tùy chỉnh delegate cho nó: ví dụ

public delegate object MethodNameDelegate(ref float y); 

Cách sử dụng:

public object MethodWithRefFloat(ref float y) 
{ 
    return null; 
} 

public void MethodCallThroughDelegate() 
{ 
    MethodNameDelegate myDelegate = MethodWithRefFloat; 

    float y = 0; 
    myDelegate(ref y); 
} 
+23

Lý do là: tất cả đối số loại chung phải là những thứ được chuyển đổi ertible để phản đối. "ref float" không thể chuyển đổi thành đối tượng, do đó bạn không thể sử dụng nó làm đối số kiểu chung. –

+1

Cảm ơn điều đó, tôi đã đấu tranh để sử dụng Func vì vậy tôi biết tại sao tôi không thể sử dụng nó khi loại không thể chuyển đổi thành đối tượng – chugh97

+0

Điều đó có nghĩa là việc nhập ủy nhiệm sẽ yêu cầu boxing/unboxing trong trường hợp này? –

5

Trong .NET 4+ bạn cũng có thể hỗ trợ ref loại theo cách này ...

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

Không phải hồi sinh một chuỗi chết nhưng nó chắc chắn phải được lưu ý cho bất cứ ai mà đi qua này mà trong khi bạn có thể hỗ trợ một param ref với generics theo cách này, các thông số loại chung sẽ là bất biến. Các tham số kiểu generic không hỗ trợ phương sai (hiệp phương sai hoặc contravariance) cho các tham số ref hoặc out trong C#. Vẫn còn tốt nếu bạn không cần phải lo lắng về chuyển đổi loại tiềm ẩn mặc dù. –

+2

Xin lỗi, câu trả lời này hơi lệch hướng. 'In' và' out' bạn đang hiển thị để tham số cho đại biểu liên quan đến "so sánh" và không liên quan đến những gì OP hỏi. Câu hỏi đặt ra là về các đại biểu có thể chấp nhận tham số bằng cách tham chiếu, không phải là sự nhanh nhẹn của một đại biểu (chung) liên quan đến tham số kiểu của nó. –

Các vấn đề liên quan