2010-07-18 18 views
6

CẬP NHẬT: Tôi đã nộp đơn này là an issue on Microsoft Connect nếu bạn có thể tái tạo điều này và/hoặc rất muốn xem lỗi này, vui lòng giúp bỏ phiếu cho vấn đề ở đó.Biên dịch không thành công nếu các định nghĩa đại biểu được đưa vào một dự án khác?


Tôi đã cố gắng giải quyết vấn đề này hàng giờ liền.
Thực sự sẽ đánh giá cao bất kỳ ý tưởng/lời khuyên nào mà bạn có thể nghĩ đến.

Trước hết, tôi có 3 tệp Class.csDefinitions.csProgram.cs. Tôi đã dán nội dung tệp qua số http://pastie.org/1049492 để bạn thử.

Vấn đề là, Nếu bạn có TẤT CẢ 3 tệp trong cùng một dự án ứng dụng bảng điều khiển. Ứng dụng biên dịch và chạy tốt.

Tuy nhiên, nếu tôi có Class.csDefinitions.cs trong một dự án "Thư viện" được tham chiếu đến từ các dự án giao diện điều khiển ứng dụng chính mà chỉ có các tập tin Program.cs, biên soạn không thành công với:

  • Đại biểu Act không lấy 2 đối số.
  • Không thể chuyển đổi biểu thức lambda ủy gõ 'DC.Lib.Produce' vì một số loại trở lại trong khối không mặc nhiên chuyển đổi thành các loại đại biểu trở lại ...

Đây là một giải pháp hoàn chỉnh với 3 dự án - 1 với tất cả các tệp được kết hợp với nhau và một tệp khác có định nghĩa được đặt trong một dự án khác:
http://dl.dropbox.com/u/149124/DummyConsole.zip

Tôi đang sử dụng phiên bản Professional RT2.

Trả lời

8

Thú vị. Tôi nghĩ rằng bạn đã tìm thấy một lỗi thực sự trong trình biên dịch C# - mặc dù tôi có thể thiếu một cái gì đó tinh tế. Tôi đã viết một phiên bản hơi đơn giản mà tránh khả năng quá tải vv sắp vào chơi, và đó pha chế với phương pháp bổ sung:

// Definitions.cs 
public interface IData { } 
public delegate IData Foo(IData input); 
public delegate IData Bar<T>(IData input, T extraInfo); 
public delegate Foo Produce<T>(Bar<T> next); 

// Test.cs 
class Test 
{ 
    static void Main() 
    { 
     Produce<string> produce = 
      next => input => next(input, "This string should appear."); 
    }  
} 

Trình diễn biên soạn là một trong lắp ráp, không có lỗi:

> csc Test.cs Definitions.cs 

Trình diễn biên soạn như hai quốc hội với các lỗi:

> csc /target:library Definitions.cs 
> csc Test.cs /r:Definitions.dll 

Test.cs(5,43): error CS1662: Cannot convert lambda expression 
     to delegate type 'Produce<string>' 
     because some of the return types in the block are not 
     implicitly convertible to the delegate return type 
Test.cs(5,52): error CS1593: Delegate 'Bar' does not take 2 arguments 

tôi không thể nghĩ ra bất kỳ lý do tại sao điều này nên khác nhau giữa các hội đồng khác nhau, như mọi thứ đều công khai. Spec hiếm khi nói về ranh giới lắp ráp khác hơn là vì lý do internal.

Thật thú vị, tôi gặp lỗi tương tự cho cả trình biên dịch C# 3 và 4.

Gửi email Eric và Mads bây giờ ...

EDIT: Lưu ý rằng bạn có thể làm việc xung quanh này sử dụng một danh sách tham số rõ ràng.Ví dụ, trong mẫu mã của tôi, điều này sẽ làm việc:

Produce<string> produce = 
    (Bar<string> next) => input => next(input, "This string should appear."); 
+0

Cảm ơn! Đang chờ đợi để có thêm phản hồi ... Hy vọng rằng tôi không phải quay lại 3.5 chỉ vì TT – chakrit

+1

@chakrit: Tôi đã giải quyết vấn đề này, nhưng tôi không thấy cách quay lại .NET 3.5 sẽ giúp bạn - như tôi đã nói, tôi đã thấy cùng một vấn đề với trình biên dịch C# 3. –

+0

Tôi đang viết lại/refactoring một thư viện mà làm việc tốt trong 3.5 để sử dụng mới NET 4.0 công cụ .... Tôi đoán tôi phải đã vấp lên một số dây trong quá trình này. – chakrit

1

tôi giải quyết này bằng cách đổi tên của C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.CSharp.targets (không xóa nó!) là cảnh báo trong cửa sổ đầu ra. Dự án mới sẽ tốt hơn nhưng không thể tải dự án trước. Sau đó tôi đổi tên lại thành tên gốc. Bây giờ cả hai dự án có thể được biên dịch mà không có lỗi. Đây là một giải pháp thực nghiệm nhưng tôi hy vọng nó sẽ giúp

Các vấn đề liên quan