Tôi đã gặp một vấn đề lạ mà tôi vừa mới nhận thấy.Thừa kế mạng - Tự động phụ thuộc tham chiếu đến vấn đề hành vi
Nếu bạn có một giải pháp với 3 dự án
** NOTE Chỉnh sửa sau khi thảo luận ** Liba
dự án - Có một ClassA
namespace LibA
{
public class ClassA
{
public override string ToString()
{
return "The logic in class A!";
}
}
}
Dự án LibB - Có một ClassB
using LibA;
namespace LibB
{
public class ClassB
{
public ClassA a;
public ClassB()
{
a = new ClassA();
}
public object Foo()
{
return a;
}
}
}
Dự án LibC - Có ClassC
using LibB;
namespace LibC
{
public class ClassC
{
public ClassB b;
public ClassC()
{
b = new ClassB();
}
public object Foo()
{
return b.Foo();
}
}
}
Cuối cùng một người lái xe thử nghiệm
using System;
using LibC;
namespace Shell
{
class Program
{
static void Main(string[] args)
{
ClassC c = new ClassC();
Console.WriteLine(c.Foo());
}
}
}
Bây giờ nếu bạn biên dịch này, mọi thứ sẽ hoạt động hoàn hảo. Nếu bạn kiểm tra nội dung của thư mục nhị phân của LibC, bạn sẽ thấy rằng nó tự động cuộn qua chuỗi phụ thuộc để xác định rằng nó cần phải kéo vào LibA và LibB
Tuy nhiên, nếu bạn thay đổi ClassB để kế thừa từ lớp A như
using LibA;
namespace LibB
{
public class ClassB : ClassA
{
ClassA a;
}
}
nỗ lực để biên dịch, bạn sẽ nhận được lỗi
lỗi 2 các loại 'LibA.ClassA' được định nghĩa trong một hội đồng đó không được tham chiếu. Bạn phải thêm tham chiếu vào assembly 'LibA, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'.
** Câu hỏi gốc **
Có ai biết tại sao (cho dù đó là msbuild hoặc visual studio) nó là đủ thông minh để tham khảo Liba khi ClassA thành viên của ClassB, nhưng nó không phải là thông minh đủ để tham chiếu LibA khi ClassA là lớp cơ sở của ClassB?
Tôi biết đó là nitpicky, nhưng tôi thực sự sẽ đánh giá cao một số hành vi nhất quán
** Câu hỏi sửa đổi với những thử nghiệm quan sát **
tôi nghe những gì một số định nghĩa là "trực tiếp" hay "gián tiếp" tài liệu tham khảo. Tuy nhiên, trực tiếp rõ ràng không chỉ là phạm vi khả năng hiển thị, nó có vẻ là thừa kế và sử dụng thực tế của một loại.
Không thừa kế, trình điều khiển thử nghiệm đủ thông minh để giải quyết và tự động tham chiếu LibA, LibB và LibC.
Có một số công khai thành viên ClassA hiển thị trong ClassB và chỉ riêng việc đó không tạo ra lỗi biên dịch/liên kết.
Trình gỡ lỗi chắc chắn giải quyết ClassA khỏi trình điều khiển thử nghiệm, do đó, nó tải rõ ràng lắp ráp chính xác.
Vì vậy, với tất cả những điều đó trong tâm trí. Tôi nhận được toàn bộ công cụ "trực tiếp" và "gián tiếp" ngay bây giờ.
Điều vẫn chưa nhấp vào tôi tại sao trình liên kết/trình biên dịch/IDE không ít nhất cố gắng tự động tham khảo các phụ thuộc của thư viện tham chiếu trong kịch bản "trực tiếp"? Rõ ràng là đủ thông minh để biết các phụ thuộc ở đó và tham khảo chúng trong một kịch bản "gián tiếp".
thú vị .... +1 – RPM1984
Chắc chắn thú vị nhất. Là một cựu anh chàng VB.NET, đây là điều tôi không thể hiểu được. Trình biên dịch VB.NET đủ thông minh để phụ thuộc chuỗi dự án; tại sao trình biên dịch C# lại không? – Crono