Theo tiêu đề, có thể khai báo ràng buộc loại bỏ trong C# 4 không?generic KHÔNG ràng buộc ở đâu T:! IEnumerable
Trả lời
Không - không có khái niệm nào như vậy trong C# hoặc trong CLR.
Khái niệm này sẽ biến nó thành C# và/hoặc CLR trong tương lai? –
@RandRandom: Tôi chưa từng nghe về bất kỳ kế hoạch nào cho nó. –
Không, nhưng nó sẽ có thể kiểm tra với một "là" và sau đó xử lý nó một cách thích hợp ...
Bạn sử dụng một hạn chế, do đó bạn có thể đảm bảo các loại mà bạn sử dụng có một số thuộc tính/phương pháp/.. . bạn muốn sử dụng.
Một chung chung với một ràng buộc loại-phủ định không có ý nghĩa gì, vì không có mục đích để biết sự vắng mặt của một số thuộc tính/phương pháp bạn không muốn sử dụng.
rõ ràng là bạn chưa nhận được lỗi: ## '
Tôi đã có thể làm việc xung quanh kịch bản của mình bằng cách sử dụng một loạt các lớp trừu tượng thực hiện một thể hiện của giao diện tương tự và kế thừa lớp trừu tượng. đó là cách Action
Theo như tôi biết thì không thể thực hiện điều đó.
gì bạn có thể làm một số kiểm tra thời gian chạy:
public bool MyGenericMethod<T>()
{
// if (T is IEnumerable) // don't do this
if (typeof(T).GetInterface("IEnumerable") == null)
return false;
// ...
return true;
}
Bạn không thể sử dụng 'is' như thế - nó kiểm tra xem một đối tượng * có tương thích với một loại hay không. –
ý của bạn là 'if (typeof (T) == typeof (IEnumerable)) {}' – kev
một sử dụng cho điều này sẽ là một loại tùy chọn.
public class Option<A,B>
where A : !B
where B : !A
{
private readonly A a;
private readonly B b;
private Option(){}
public Option(A a)
{
this.a = a
}
public Option(B b)
{
this.b = b
}
}
Kiểm tra thời gian chạy sẽ hoạt động nhưng bạn sẽ không có lợi ích khi kiểm tra loại lúc biên dịch.
tôi thấy bản thân tôi cố gắng để thực hiện các cùng trường hợp đề cập trong các ý kiến:
void doIt<T>(IEnumerable<T> what) { }
void doIt<T>(T whats) { }
tôi trừ đoạn mã sau để tham khảo các phương pháp đầu tiên:
doIt(new List<T>());
Nhưng nó thực sự tham chiếu đến giây thứ hai.
Một giải pháp là cast lập luận như thế này:
doIt(new List<T>().AsEnumerable<T>());
Dàn diễn viên có thể được ẩn bởi tình trạng quá tải khác:
void doIt<T>(List<T> whats) {
doIt(whats.AsEnumerable<T>());
}
- 1. Eclipse lưu trữ các ràng buộc bàn phím ở đâu?
- 2. Generic TimeSpan ràng buộc trong Asp.NET MVC 2
- 3. Tại sao IEnumerable <T> .Max buộc T là IComparable?
- 4. IEnumerable <IEnumerable <T>> để IEnumerable <T> sử dụng LINQ
- 5. Cast IEnumerable để IEnumerable <T> khi T không biết tại thời gian biên dịch
- 6. IEnumerable <T> trong OCaml
- 7. Làm thế nào để thiết lập các ràng buộc về các kiểu generic trong Java?
- 8. Hàm Java này suy ra loại generic của nó ở đâu?
- 9. Ràng buộc một Java Class Generic đến một JSON sử dụng JAXB
- 10. Ràng buộc kiểm tra khóa ngoài T-SQL
- 11. std :: ràng buộc một hàm ràng buộc
- 12. Triển khai IEquatable <T> khi T có thể là IEnumerable <T>
- 13. Chuyển đổi/Truyền IEnumerable thành IEnumerable <T>
- 14. Tại sao IEnumerable <T> kế thừa từ IEnumerable?
- 15. Sự khác nhau giữa IEnumerable và IEnumerable <T>?
- 16. Cú pháp lắp ráp tại & t ở đâu?
- 17. Làm thế nào để chuyển đổi một IEnumerable <IEnumerable <T>> thành IEnumerable <T>
- 18. Ràng buộc bản mẫu C++
- 19. ngầm đúc một generic <T> trở lại T
- 20. NET Reflection: Phát hiện IEnumerable <T>
- 21. nhận loại T từ IEnumerable <T>
- 22. Lớp phát sinh từ Generic T
- 23. Yêu cầu không rõ ràng về Generic ContinueWith
- 24. Generic InternPool <T> bằng Java?
- 25. Generic <T> cách truyền?
- 26. LINQ ở đâu từ khóa so với Thông số mở rộng và tham số ở đâu
- 27. Làm thế nào để thực hiện IEnumerable <T>
- 28. IEnumerable.GetEnumerator() và IEnumerable <T> .GetEnumerator()
- 29. EditorFor IEnumerable <T> với TEMPLATENAME
- 30. Tạo IEnumerable <T> .find()
thậm chí nếu có, bạn có thể mô tả một trường hợp sử dụng? –
Thật lạ khi quan sát bạn có một yêu cầu như vậy. bạn chỉ có thể viết mã với loại T mà bạn biết rằng thuộc về một họ lớp. Làm thế nào bạn có thể mã trong generics nếu không? Hoặc bạn không cần generics trong trường hợp này hoặc bạn cần phải sửa đổi trường hợp sử dụng của bạn. –
trường hợp sử dụng được quan tâm là cho phép các quá tải sau cùng tồn tại 'void doIt (T gì) {}' 'void doIt (IEnumerable whats) {}' - tại thời điểm có sự mơ hồ vì 'T 'trong phương thức đầu tiên có thể là một' IEnumerable <> '(vì vậy tôi muốn xác định rằng' T' KHÔNG nên là 'IEnumerable') ... –
Cel