01/10/2018, 16:47

Tại sao cast không thành công?

Mình đã viết toán tử ép kiểu trong lớp ObjectData:

public static explicit operator SimpleData(ObjectData Input)
{
    return new SimpleData(Input.ToString());
}

Values[i] là đối tượng lớp abstract, chỉ có 2 lớp ObjectDataSimpleData kế thừa lớp đó.

Tên Gì Cũng Được viết 19:02 ngày 01/10/2018

Có thể cast con thành cha chứ không thể cast cha thành con được
vì con có đầy đủ thuộc tính và phương thức của cha, còn ngược lại cha thì không chắc có đủ thuộc tính hay phương thức của con nên không case được

Trần Hoàn viết 18:58 ngày 01/10/2018

Đó là cast mặc định, còn mình đã nạp chồng toán tử rồi mà. Khi đó không cần có quan hệ kế thừa cũng cast được. 2 lớp này không cái nào kế thừa cái nào cả.

Để mình sửa lại câu hỏi cho rõ.

Quân viết 18:47 ngày 01/10/2018

Mình đã viết toán tử ép kiểu trong lớp ObjectData:
Values[i] là đối tượng lớp abstract, chỉ có 2 lớp ObjectData và SimpleData kế thừa lớp đó.

nghĩa là nó k có biết gì về cái operator mà bạn định nghĩa, do đó implicit cast được sử dụng. Khi implicit cast được sử dụng thì bạn biết điều gì xảy ra với code của bạn rồi đấy
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/explicit

Trần Hoàn viết 18:52 ngày 01/10/2018

Khi mình viết cả explicit và implicit, kết quả đều như vậy

Trương Tấn Phát viết 18:53 ngày 01/10/2018
return ((SimpleData)(ObjectData)Values[i]).Value;
Trần Hoàn viết 18:54 ngày 01/10/2018

Cách đó cũng lỗi vl bác ạ. Vì Values nó có thể là 1 trong 2 kiểu chứ không phải chỉ có kiểu ObjectData đâu. Giờ thì nó lại thành Unable to cast object of type ‘SimpleDataModel.SimpleData’ to type ‘SimpleDataModel.ObjectData’
Nhưng mà đến đây thì mình cũng tự giải thích đc rồi, không biết có đúng không. Nếu viết implicit thì đoạn cast tường minh bị lỗi, viết explicit thì đoạn cast ngầm định bị lỗi, viết cả 2 thì IDE báo lỗi trùng.

Thôi, đành viết try-catch bắt InvalidCastException vậy.

Tao Không Ngu. viết 18:50 ngày 01/10/2018

Hi Trần Hoàn.

  1. Ép kiếp là một việc nên tránh vì nó có thể phát sinh nhiều lỗi khi runtime và chi phí kiểm tra kiểu. Bạn có thể nêu rõ yêu cầu để mọi người góp ý giải pháp tốt nhât.
  2. Phương thức bạn viết nó khá giống với một cái dic tại sao lại không dùng dic.
Trần Hoàn viết 19:03 ngày 01/10/2018

Mình đang phát minh lại cái xe đạp mà :))
Với lại mình đang tìm cách để phần Values có thể chứa cùng lúc 2 kiểu dữ liệu khác nhau là string và dic, và có thể cả array để xây dựng hệ quản trị CSDL no SQL

Bài liên quan
0