我在解决方案中有多个项目,所有项目都针对4.7.2。然后在lib项目中添加一个返回valueTuple的方法。多个项目调用此方法,除一个项目外,其他所有项目均正常(已编译)。这个项目会产生编译器错误。
Error CS1061 ValueTuple<IEnumerable<User>, Dictionary<string, string>, Dictionary<string, string>>' does not contain a definition for 'CreatedUsers' and no extension method 'CreatedUsers' accepting a first argument of type 'ValueTuple<IEnumerable<User>, Dictionary<string, string>, Dictionary<string, string>>' could be found (are you missing a using directive or an assembly reference?)
我已经将该项目中的所有nuget pkgs与其他项目进行了比较,只是有细微的差别,然后我取消了所有这些不同的nuget,仍然是相同的错误。我四处搜索,知道4.7已内置valuetuple,然后检查了此项目,该项目在任何地方都没有System.ValueTuple
nuget或硬编码的System.ValueTuple.dll。
请帮助。我总是可以回到Tuple <>的方式,但是valuetuple更干净。除非您告诉我,否则还有其他隐藏的问题。
谢谢!
The method that returns valuetuple
public static async Task<(IEnumerable<User> CreatedUsers, Dictionary<string, string> ErrorMsgsA, Dictionary<string, string> ErrorMsgsB)> CreateNewUsers(string param1, CreateUserDTO param2)
{
... ...
... ...
return (createdUs, ErrorMsgs_a, ErrorMsgs_b);
}
导致错误的行:
var createUserResult = await CreateNewUsers(param1, param2);
var created = createUserResult.CreatedUsers; //error
就这样,编译器抱怨找不到返回的元组中的项。我在这里列出了编译器错误,该错误抱怨valuetuple中的第一项“ CreatedUsers”。实际上,其他每个valuetuple项都存在一个编译器错误,即“ ErrorMsgsA”,ErrorMsgsB。记住,我在这个valuetuple中引用它的其他项目都很好,没有错误。
答案 0 :(得分:0)
您的方法签名存在声明ValueTuple的语法错误。因为您不能在诸如{
"compilerOptions": {
"target": "es6"
}
}
之类的通用类型声明中进行ValueTuple属性名的初始化。您在ValueTuple中声明的所有属性名称都必须具有具体类型。
从以下位置更改方法签名:
Task<T>
收件人:
public static async Task<(IEnumerable<T1> CreatedUsers, Dictionary<string, string> ErrorMsgsA, Dictionary<string, string> ErrorMsgsB)> CreateNewUsers(string param1, dtotype param2)
或者,您可以将public static async Task<ValueTuple<IEnumerable<T1>, Dictionary<string, string>, Dictionary<string, string>> CreateNewUsers(string param1, dtotype param2)
更改为具体类型,例如对象:
T1
然后您可以编译代码。
答案 1 :(得分:0)
好的,我知道了原因。
问题项目正在使用较旧的编译器。
我不得不删除了两个软件包,这些软件包存在多年了,很可能是我们购买的源代码附带的。这些年来,让我不禁思索的是,我们一直在使用由这样的旧编译器编译的软件,但这就是事实:
Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0 Microsoft.Net.Compilers.1.0.0
现在问题解决了。