0

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

4

2 回答 2

2

好的,我找到了原因。

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

我不得不删除两个已经存在多年的软件包,很可能是我们购买的源代码附带的。这些年来我们一直在使用由如此旧的编译器编译的软件,这让我汗流浃背,但事实就是这样:

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

现在问题消失了。

于 2019-06-11T17:37:12.903 回答
0

您的方法签名存在声明 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为具体类型,例如 Object:

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

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

于 2019-06-10T04:07:51.237 回答