2010-01-14 44 views
7

Tôi hơi bối rối về những điều sau đây.Câu hỏi truyền C# .net

Với lớp này:

public class SomeClassToBeCasted 
    { 
     public static implicit operator string(SomeClassToBeCasted rightSide) 
     { 
      return rightSide.ToString(); 
     } 
    } 

Tại sao một InvalidCastException ném khi tôi cố gắng làm như sau?

IList<SomeClassToBeCasted> someClassToBeCastedList 
    = new List<SomeClassToBeCasted> {new SomeClassToBeCasted()}; 
IEnumerable<string> results = someClassToBeCastedList.Cast<string>(); 

foreach (var item in results) 
{ 
    Console.WriteLine(item.GetType()); 
} 

Trả lời

16

Cast() không đối phó với phôi người dùng chỉ định - chỉ chuyển đổi tài liệu tham khảo (ví dụ: các loại bình thường của chuyển đổi của một tham chiếu lên hoặc xuống hệ thống phân cấp thừa kế) và boxing/chuyển đổi unboxing. Nó không giống như những gì một diễn viên sẽ làm trong mã nguồn. Đáng tiếc là điều này không được ghi nhận rõ ràng :(

EDIT: Chỉ cần để mang lại bình luận của Jason vào bưu điện, bạn có thể làm việc xung quanh này một cách dễ dàng với một chiếu:

IEnumerable<string> results = originalList.Select(x => (string) x); 
+3

Và, để thêm, bạn có thể nhận được "xung quanh" này với 'IEnumerable kết quả = someClassToBeCastedList.Select (x => (string) x);' – jason

6

Nếu chỉ cần thiết cho các danh sách, bạn có thể làm

IEnumerable<string> results = 
     someClassToBeCastedList.Select(itm => itm.ToString()); 

để thay thế.

+1

này thậm chí không sử dụng người dùng xác định dàn diễn viên mà OP được xác định. – jason

+0

Vâng, đó là ý của tôi về danh sách. Nó phụ thuộc vào nếu chức năng điều hành diễn viên đó là cần thiết ở những nơi khác quá. – herzmeister

-1

bạn có thể sử dụng i để có vấn đề tương tự, nó sẽ giúp bạn

Kết quả IEnumerable = originalList.Select (x => (chuỗi) x);