繁体   English   中英

不能将类型“string”隐式转换为“string[]”

[英]Cannot implicitly convert type "string" to "string[]"

我正在尝试使用名称和路径将项目添加到列表框,我收到此错误:

不能将类型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 ,因此出现错误。

FileSystemInfo.FullName 属性
FileSystemInfo.Name 属性

将您的声明更改为:

    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进行枚举

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM