Ai đó có thể làm rõ từ khóa C# is
vui lòng. Cụ thể là 2 câu hỏi sau:Tại sao "int [] là uint [] == true" trong C#
Q1) dòng 5; Tại sao điều này trở lại đúng?
Q2) dòng 7; Tại sao không có ngoại lệ cast?
public void Test()
{
object intArray = new int[] { -100, -200 };
if (intArray is uint[]) //why does this return true?
{
uint[] uintArray = (uint[])intArray; //why no class cast exception?
for (int x = 0; x < uintArray.Length; x++)
{
Console.Out.WriteLine(uintArray[x]);
}
}
}
Mô tả của MSDN không làm rõ tình hình. Nó tuyên bố rằng is
sẽ trả về true nếu một trong các điều kiện này được đáp ứng. (Http://msdn.microsoft.com/en-us/library/scekt9xw(VS.71).aspx>MDSN Điều)
expression is not null. expression can be cast to type.
Tôi không tin rằng bạn có thể làm một dàn diễn viên hợp lệ int [] thành uint []. Bởi vì:
A) Mã này không biên dịch:
int[] signed = new int[] { -100 };
uint[] unsigned = (uint[])signed;
B) Làm các diễn viên trong chương trình gỡ rối cho một lỗi:
(uint[])signed
"Cannot convert type 'int[]' to 'uint[]'"
Chắc chắn, nếu dòng 3 là int [] thay vì đối tượng thì nó sẽ không bao giờ biên dịch. Điều này đưa tôi đến câu hỏi cuối cùng liên quan đến quý 2.
Q3) Tại sao C# tăng lỗi truyền/chuyển đổi trong trình gỡ rối và trình biên dịch nhưng không phải lúc chạy?
Eric Lippert ở đâu khi bạn cần anh ấy? –
Sai, đây là Stack Overflow, bạn có nghĩa là "Jon Skeet ở đâu khi bạn cần anh ấy?" ;) – Ash
Kiểm tra câu trả lời của tôi, tôi đã cập nhật liên kết tới video mà tôi nghĩ giải thích vấn đề cơ bản. Kiểm tra nó ra! –