簡體   English   中英

如何避免 vb.net 中的后期綁定

[英]how to avoid late binding in vb.net

我有一個用 vb.net 編寫的項目,.net 版本是 3.5,它運行良好,沒有任何問題,現在我決定將它轉換為 C#。 我使用的不僅僅是工具,比如 Instantc#、vbconversion,還有 Visual Studio 的擴展,所有這些都給了我后期綁定圖像的錯誤:左側是 vb.net 代碼,右側是轉換為(即 c#)

在此處輸入圖片說明

在另一個地方也有同樣的錯誤,請參見圖片: 在此處輸入圖片說明

請幫助我如何在 vb 代碼中解決此問題,以便轉換正常或在 c# 代碼中。

后期綁定錯誤

默認情況下,C# 在數據類型方面比 VB 更嚴格。 VB 可以讓你將任何東西分配給一個對象,並編寫代碼來調用它的方法,如果你認為它們在那里的話:

Dim o as Object
o = "hello"

Console.Write(o.Length) 'length of string

如果Option Strict處於On VB 不允許您執行此操作 - 默認情況下它處於 Off 狀態,這可能是 VB.NET 程序中錯誤的第一大原因。 它還鼓勵草率的編碼習慣

C# 不會讓你這樣做* - 你必須一直嚴格和准確,如果你已經將一個字符串分配給一個對象,那么你必須在使用它之前通過進行強制轉換來證明你知道其中的內容:

Object o;
o = "hello";

Console.Write(((string)o).Length) 'cast o to string, then get length of string

一直在做這種轉換真的很乏味,因為預先聲明正確的類型要容易得多:

String o;
o = "hello";

Console.Write(o.Length) 

后期綁定是一個特性,它可以讓你在編譯時跳過嚴格的限制,編譯器只會假設你是對的,並在運行時自己弄清楚對象變量內部是什么樣的東西。 如果它是一個字符串,那么 Length 就可以正常工作。 如果它是一個沒有Length的整數,你會崩潰


所以,因為object沒有SetDataSource方法; 您必須在編譯時聲明正確的rpt類型。 如果它是某個 CrystalReports ReportViewer 類,那么您確實必須將其聲明為

using CrystalReports;
...
ReportViewer rpt;
if(...)

rpt.SetDataSource(...);

*有辦法,但我不會深入研究,因為它不利於學習

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM