我试图使用 Lambda 表达式发现连接到系统的所有逻辑磁盘,并使用 wait 关键字异步执行该函数。除了返回语句之外,一切似乎都很好。
return(Search.Get());
由于以下错误而无法编译:
"Cannot convert lambda expression to delegate type 'System.Func>' because some of the return types in the block are not implicitly convertible to the delegate return type (CS1662) - D:\PugApplications\Pug_AdvancedControls\Pug_AdvancedControls\Pug_FileSystemTree\Pug_FileSystemNode.cs:34,14
我该怎么做?我读到的所有内容都表明这应该有效。
Pug_DriveType 只是我为镜像 Win32 DriveType 枚举而编写的一个枚举。
//读取驱动器
Func<Pug_DriveType, Task<ManagementObjectCollection>> ReadTask = (Pug_DriveType DT) =>
{
StringBuilder Query =
new StringBuilder("SELECT * FROM Win32_LogicalDisk WHERE DriveType=\"")
.Append((int)DT).Append("\"");
ManagementObjectSearcher Search = new ManagementObjectSearcher(Query.ToString());
return (Search.Get());
};
感谢您的帮助 丹尼
最佳答案
我认为你想要更多类似这样的东西:
Func<Pug_DriveType, Task<ManagementObjectCollection>> ReadTask = async (Pug_DriveType DT) =>
{
StringBuilder Query =
new StringBuilder("SELECT * FROM Win32_LogicalDisk WHERE DriveType=\"")
.Append((int)DT).Append("\"");
ManagementObjectSearcher Search = new ManagementObjectSearcher(Query.ToString());
return await Task.Run(() => Search.Get());
};
或者可能:
Func<Pug_DriveType, Task<ManagementObjectCollection>> ReadTask = (Pug_DriveType DT) =>
{
StringBuilder Query =
new StringBuilder("SELECT * FROM Win32_LogicalDisk WHERE DriveType=\"")
.Append((int)DT).Append("\"");
ManagementObjectSearcher Search = new ManagementObjectSearcher(Query.ToString());
return Task.Run(() => Search.Get());
};
(取决于您最终可能会在其中放入匿名方法的其他内容。)
以上任一情况都会导致您的匿名方法返回 Task<ManagementObjectCollection>
,已声明的委托(delegate)类型变量的返回类型,委托(delegate)实例被分配到该变量。您收到的错误告诉您 lambda 表达式返回的类型与为表达式推断的委托(delegate)类型(基于变量的类型)不同。
关于c# - 任务、等待和 ManagementObjectCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26986011/