valuetuple无法用于我的4.7.2项目之一

时间:2019-06-10 03:40:22

标签: c# .net valuetuple

我在解决方案中有多个项目,所有项目都针对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中引用它的其他项目都很好,没有错误。

2 个答案:

答案 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

现在问题解决了。