tôi có phương pháp sau đây:Làm thế nào để trình biên dịch C# suy ra các kiểu generic?
public TResult Get<TGenericType, TResult>()
where TGenericType : SomeGenericType<TResult>
where TResult : IConvertible {
//...code that uses TGenericType...
//...code that sets someValue...
return (TResult) someValue;
}
Ngay bây giờ, một người sử dụng của phương pháp này có sử dụng nó như thế này:
//Notice the duplicate int type specification
int number = Get<SomeGenericType<int>, int>();
Tại sao tôi phải chỉ rõ TResult trong phương pháp defintion? Trình biên dịch đã biết TResult kể từ khi tôi chỉ định nó trong TGenericType. Lý tưởng nhất (nếu biên dịch C# là một thông minh hơn chút), phương pháp của tôi sẽ trông như thế này:
public TResult Get<TGenericType>()
where TGenericType : SomeGenericType<TResult>
where TResult : IConvertible {
//...code that uses TGenericType...
//...code that sets someValue...
return (TResult) someValue;
}
Vì vậy, người dùng chỉ đơn giản là có thể sử dụng nó như thế này:
//Much cleaner
int number = Get<SomeGenericType<int>>();
Có cách nào để làm tôi muốn làm gì?
Tôi nghĩ rằng việc xóa một số vòng loại như * stupid * khỏi mô tả câu hỏi sẽ giúp ích. – EFraim
Đó là trình biên dịch ngu ngốc, phải không? ;) Tôi đã xóa bình luận không liên quan. Đây thực sự là một câu hỏi hợp lý mà không có nó. –
Vì bạn đã được trả lời rằng không có cách nào để sử dụng chỉ một số thông số loại, có lẽ bạn nên cải cách câu hỏi của mình về những gì bạn muốn thực hiện. Như nó là viết tắt, câu hỏi của bạn là "làm thế nào để tôi làm cho trình biên dịch mã biên dịch C# vi phạm định nghĩa của ngôn ngữ C#?" Như vậy, nó phải được đóng lại là "không phải là một câu hỏi thực sự". –