Gần nhất bạn có thể nhận được là hạn chế thời gian chạy.
Chỉnh sửa: Ban đầu tôi đặt kiểm tra thời gian chạy trong lệnh gọi hàm tạo. Đó thực sự không phải là tối ưu, vì nó phải gánh chịu mọi chi phí trên mọi instantiation; Tôi tin rằng nó sẽ được nhiều hơn nữa hợp lý để đặt dấu check ở mục tĩnh constructor, mà sẽ được gọi một lần cho mỗi loại sử dụng làm tham số T
cho loại Blah<T>
của bạn:
public class Blah<T> {
static Blah() {
// This code will only run ONCE per T, rather than every time
// you call new Blah<T>() even for valid non-string type Ts
if (typeof(T) == typeof(string)) {
throw new NotSupportedException("The 'string' type argument is not supported.");
}
}
}
Rõ ràng không lý tưởng, nhưng nếu bạn đặt ràng buộc này vào vị trí và ghi lại thực tế là string
không phải là đối số kiểu được hỗ trợ (ví dụ: thông qua nhận xét XML), bạn sẽ nhận được ở đâu đó gần hiệu quả của ràng buộc biên dịch.
Nguồn
2011-08-17 16:41:48
không nghĩ rằng điều này là có thể - nhưng tại sao bạn sẽ cần một cái gì đó như thế này? – Carsten
Hành vi mong muốn khi ai đó cố gắng chuyển sang loại không được hỗ trợ? –
Tôi thực sự đã cố gắng để loại trừ các loại chuỗi, nhưng nó chỉ ra rằng bằng cách sử dụng nơi T: struct làm việc cho những gì tôi đang cố gắng làm kể từ lớp của tôi sẽ không làm việc cho các loại phức tạp anyways. –