无法隐式转换类型“”;字符串“;至“;字符串[]”;

本文关键字:字符串 类型 转换 | 更新日期: 2023-09-27 18:13:05

我正在尝试将带有名称和路径的项目添加到列表框中,我得到了这个eror:

无法将类型string隐式转换为string[]

string path = textbox1.Text;
string[] FileName, FilePath;
DirectoryInfo directoryInfo = new DirectoryInfo(path);
FileInfo[] files = directoryInfo.GetFiles();
foreach( FileInfo fileInfo in files)
{
    FileName = fileInfo.FullName; // Here 
    FilePath = fileInfo.Name; // and here 
    listbox2.Items.Add(fileInfo.FullName);
}

无法隐式转换类型“”;字符串“;至“;字符串[]”;

您已经声明了这一点:

string[] FileName, FilePath;

所以分配这个:

FileName = fileInfo.FullName; // Here 
FilePath = fileInfo.Name; // and here

正在将字符串(例如fileInfo.FullName是一个字符串(分配给字符串数组。

你想做的是列出这些,所以定义列表并添加值:

string path = textbox1.Text; 
var FileNames = new List<string>(); 
var FilePaths = new List<string>();
DirectoryInfo directoryInfo = new DirectoryInfo(path); 
FileInfo[] files = directoryInfo.GetFiles();
foreach( FileInfo fileInfo in files) {
    FileNames.Add(fileInfo.FullName); // Here 
    FilePaths.Add(fileInfo.Name); // and here 
    listbox2.Items.Add(fileInfo.FullName); 
}

您已经将FileNameFilePath定义为string[]。看起来好像您希望它们每个都包含一个字符串值。

string[] FileName, FilePath;

将其更改为string

string FileName, FilePath;
string[] FileName, FilePath;

您将FileNameFilePath声明为数组,但FullNameName都返回string,因此出现错误。

文件系统信息。FullName属性
文件系统信息。名称属性

将您的申报更改为:

    string FileName, FilePath;

问题是FileNameFilePath被声明为string[],但您正试图为它们分配一个string。但是,由于您说您正在尝试将具有名称和路径的文件列表添加到列表框中,因此根本不需要FileNameFilePath变量。更容易的是设置ListBoxDataSource,并设置要显示的对象属性:

listbox2.DisplayMember = "Name"; //The Name property from FileInfo
listbox2.DataSource = files;

然后,当需要获取所选项目时,将其转换为FileInfo:

var selectedFileInfo = (FileInfo)listbox2.SelectedItem;
var selectedFileName = selectedFileInfo.Name;
//etc

简单地声明FileNamesFilePaths以键入List<string>并在单个foreach循环中执行Add可能会更好,但这里有一个linq替代方案。


string[] FileNames, FilePaths;

在两个linq操作中使用匿名函数委托。

FileNames = files.Select( f => f.FullName).ToArray();
FilePaths = files.Select( f => f.Name).ToArray();
listBox2.AddRange(files.Select(FileNames)); //AddRange can take either IEnumerable<T> or T[] as a parameter

如果您先构建表达式,它会变得更清晰(也许会更优化(,因为您没有声明匿名委托函数。

// these can be declared out of function scope as readonly..
Func<FileInfo, string> SelectFullName = (f) => f.FullName;
Func<FileInfo, string> SelectName = (f) => f.Name;
FileNames = files.Select(SelectFullName).ToArray();
FilePaths = files.Select(SelectName).ToArray();
listBox2.AddRange(FileNames);

linq方法的优点是,在添加项

时,不需要通过FileNamesFilePaths进行枚举