我正在將代碼從Lazarus轉換到Delphi 10.4 Sydney,有一行拋出了一個錯誤:
// Split line and put it into a new array, txtDataArray
txtDataArray := txtToParse.Split(['.', ', ', '! '], TStringSplitOptions.ExcludeEmpty) 。
txtToParse是逗號分隔的文本變數。
我怎樣才能正確地寫出在Delphi 10.4 Sydney中的作業呢?
我試了一下,得到的錯誤資訊是:
我試了一下,得到的錯誤資訊是:
不兼容的型別--動態陣列和System TArray<System String>在第340行:
在var下我有:
// for splitting
charArray : Array[0.2] of Char;
txtToParse : String;
txtArray : array of String;
然后在主函式中我有:
//分割行并把它放入一個新的陣列,txtArray。
charArray[0] := '. ' ;
charArray[1] := ',';
charArray[2] := '!'。
txtArray := txtToParse.Split(charArray)。
我怎樣才能在Delphi 10.4 Sydney中實作這個功能?
uj5u.com熱心網友回復:
你需要改變這個宣告:
txtArray : array of String;
變成這樣:
txtArray : TArray<String>;
檔案中詳細解釋了原因:
Type Compatibility and Identity (Delphi)
<而且特別是:
只有當陣列的型別相同時,它們才是賦值兼容的。因為Delphi語言對型別使用了名稱等價法,所以下面的代碼將無法編譯。
var Int1: array[1...10] of Integer; Int2: array[1...10] of Integer。 ... Int1 := Int2;為了使賦值作業,宣告變數為:
。var Int1, Int2: array[1...10] of Integer;或者:
type IntArray = array[1.10] of Integer; var Int1: IntArray; Int2: IntArray;
而且
兩個非實體化的泛型只有在它們是相同的或者是對一個共同型別的別名時才被認為是賦值兼容。
如果兩個實體化的泛型是相同的(或者是一個共同型別的別名),并且型別引數是相同的,則被認為是賦值兼容的。
在FreePascal中,Split()回傳一個TStringArray,它是array of string的簡單別名,因此與array of string變數賦值兼容。
但是在Delphi中,Split()回傳一個TArray<String> ,它是array of T的通用別名,其中T是string,所以它是一個獨特的通用型別,因此不與array of String變數賦值兼容,只與TArray<String>變數兼容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316501.html
標籤:
