valuetuple 不适用于我的 4.7.2 项目之一

valuetuple doesn't work for one of my 4.7.2 projects

我在解决方案中有多个项目,都针对 4.7.2。然后,我在 returns valueTuple 的 lib 项目中添加了一个方法。多个项目调用此方法,除一个项目外,所有项目都可以正常(编译)。这个项目会产生编译器错误。

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?)

我已经将这个项目中的所有 nugets pkgs 与其他项目进行了比较,细微差别,然后我卸载了那些不同的 nugets,仍然是同样的错误。我四处搜索,知道 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"。对于每个其他值元组项目 "ErrorMsgsA",ErrorMsgsB,实际上都有一个编译器错误。请记住,我在这个 valuetuple 中引用 itmes 的其他项目都很好,没有错误。

您的方法签名在声明 ValueTuple 时存在语法错误。因为你不能在泛型类型声明中进行 ValueTuple 属性 名称初始化,例如 Task<T>。您在 ValueTuple 中声明的所有 属性 名称都必须具有具体类型。

更改您的方法签名:

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 更改为具体类型,例如对象:

public static async Task<(IEnumerable<Object> CreatedUsers, Dictionary<string, string> ErrorMsgsA, Dictionary<string, string> ErrorMsgsB)> CreateNewUsers(string param1, dtotype param2)

然后你就可以编译你的代码了。

好的,我找到原因了。

问题项目使用的是较旧的编译器。

我不得不删除两个已经存在多年的软件包,它们可能与我们购买的源代码一起提供。想想这些年来我们一直在使用这么老的编译器编译的软件,真让我汗流浃背:

Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0 Microsoft.Net.Compilers.1.0.0

现在问题解决了。