我正在尝试使用await关键字发现使用Lambda表达式连接到系统的所有逻辑磁盘,以异步方式执行该函数。除了归还声明外,一切似乎都很好。
由于此错误, return(Search.Get());
无法编译:
“无法将lambda表达式转换为委托类型'System.Func>'因为块中的某些返回类型不能隐式转换为委托返回类型(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());
};
感谢您的帮助 丹尼
答案 0 :(得分:1)
我想你想要更像这样的东西:
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>
,即委派实例所分配的声明委托类型变量的返回类型。你得到的错误告诉你,lambda表达式返回的类型不同于表达式推断的委托类型(基于变量&#39; s类型)的类型。