2010-06-09 9 views
5

Làm việc trên một dự án sử dụng một số tập lệnh IronPython dưới dạng trình cắm, sử dụng chức năng được mã hóa trong C#. Trong một lớp học C# của tôi, tôi có một tài sản đó là của loại:C#/IronPython Interop và kiểu dữ liệu "nổi"

Dictionary<int, float> 

tôi thiết lập giá trị của tài sản từ các mã IronPython rằng, như thế này:

mc = MyClass() 
mc.ValueDictionary = Dictionary[int, float]({1:0.0, 2:0.012, 3:0.024}) 

Tuy nhiên, khi bit này mã được chạy, nó ném ngoại lệ sau đây:

Microsoft.Scripting.ArgumentTypeException was unhandled by user code 
    Message=expected Dictionary[int, Single], got Dictionary[int, float] 

Để làm cho mọi việc kì quặc, ban đầu C# mã được sử dụng

Dictionary<int, double> 

nhưng tôi không thể tìm thấy loại "gấp đôi" trong IronPython, đã cố gắng "nổi" trên ý thích và nó hoạt động tốt, không có lỗi. Nhưng bây giờ nó đang sử dụng phao trên cả hai đầu (mà nó nên đã được sử dụng từ đầu) nó lỗi, và nghĩ rằng mã C# đang sử dụng loại dữ liệu "Single"?!

Tôi thậm chí đã kiểm tra trong trình duyệt đối tượng cho C# thư viện và, chắc chắn đủ, nó cho thấy như sử dụng một "phao" kiểu chứ không phải "Độc"

Trả lời

7

Tôi không thực sự nhìn thấy một câu hỏi ở đây, bạn rất tự trả lời mọi thứ. Tôi đoán bạn chỉ hỏi vì bạn đang bối rối. Vì vậy, cho phép điều rõ ràng lên:

C# có hai loại dấu chấm động: float (một từ khóa đó là viết tắt của System.SingleMSDN, dài 32 bit) và double (từ khóa cho System.DoubleMSDN, 64 bit dài).

Python ở phía bên kia sử dụng float từ khóa/loại để lưu trữ một độ chính xác gấp đôi số điểm nổi, như python documentation trạng thái:

Floating số điểm được thực hiện sử dụng gấp đôi trong C. Tất cả các cược vào họ độ chính xác bị tắt trừ khi bạn tình cờ biết máy bạn đang làm việc.

Đối với điều đó, trên kiến ​​trúc x86, dài 64 bit. Đây là lý do IronPython xử lý một trăn float dưới dạng .NET System.Double.

Điều đó nói rằng, hai phương pháp sẽ cả hai công việc:

C#:

Dictionary<int, float> single_precision_dict; 
Dictionary<int, double> double_precision_dict; 

IronPython:

single_precision_dict = Dictionary[int, Single]({1:0.0, 2:0.012, 3:0.024}) 
double_precision_dict = Dictionary[int, float]({1:0.0, 2:0.012, 3:0.024}) 
+0

Cảm ơn bạn, câu trả lời hoàn hảo. Và vâng, tôi đoán là tôi đã loại bỏ những ánh xạ, tôi chỉ không biết tại sao. Nó chỉ có vẻ truy cập trực giác nổi trong C# sẽ không được nổi trong Python. –

+0

Bạn được chào đón! Tôi đã có một vấn đề tương tự gần đây (C#/Python Interop). Thực sự rất trực quan của nó, như tất cả các ngôn ngữ giống như C, Java và nhiều hơn nữa sử dụng 'float' cho các số có độ chính xác đơn. –