2011-12-09 28 views
5

Nếu tôi có phương phápShorthand khi gọi phương pháp chung trong C#

void foo<T>(T bar){} 

tôi có thể thành công gọi nó là như thế này:

string s = string.Empty; 
foo(s); 

Như tôi đã tưởng tượng ra trình biên dịch/thời gian chạy có thể suy ra các loại,

Tuy nhiên, nếu tôi thay đổi phương thức này:

T foo<T,T2>(T2 bar){...} 

Sau đó, tôi phải gọi nó trong 'đầy đủ', xác định cả hai loại tham số đầu vào và kiểu trả về:

string s = string.Empty; 
foo<int,string>(s); 

Có cách nào tôi có thể viết tắt này vì vậy tôi không cần phải chỉ định tham số đầu vào (s) kiểu? I.E.

foo<int>(s); 

Cảm ơn

+0

Để làm rõ "Tôi tưởng tượng trình biên dịch/thời gian chạy có thể suy ra các loại": những suy luận kiểu trong ví dụ của bạn được xử lý bởi trình biên dịch. – phoog

Trả lời

3

Bạn luôn có thể viết lại phương pháp của bạn:

void foo<T, U>(U bar, out T baz) 
{ 
    baz = default(T); 
} 

nếu bạn thực sự muốn những suy luận kiểu ... Bây giờ:

string s = string.Empty; 
int i; 

foo(s, out i); 

sẽ chỉ làm việc tốt.

Ngoài ra, hãy xem: this question để có câu trả lời tuyệt vời của Eric Lippert là tại sao bạn không thể có những gì bạn muốn!

EDIT: Tôi nhận ra tôi đã không thực sự trả lời câu hỏi của bạn ...

Có cách nào tôi có thể viết tắt này vì vậy tôi không cần phải chỉ định tham số đầu vào (s) gõ?

một cách đơn giản ... số

3

Thật không may, không có cách nào cho trình biên dịch để suy ra T từ ví dụ từ việc sử dụng. Theo như nó không thể được thực hiện tự động, bạn cần phải cung cấp nó.

Không có tham số loại "tùy chọn" trong C# và không có viết tắt.

+0

Không phải loại suy luận này hoạt động với Biểu thức? Nếu vậy, tại sao không với phương pháp? – Connell

+0

Bạn có thể vui lòng làm rõ, ý của bạn trong "loại suy luận có tác dụng với Biểu thức" không. Có thể, bạn có thể đăng một ví dụ? –

+0

Tôi vừa mới tham gia và luôn có lỗi biên dịch theo bất kỳ cách nào tôi thử, nhưng tôi đã nghĩ đến các đại biểu hoặc lambda. Không phải Func thực hiện chính xác điều này? – Connell

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