【问题标题】:valuetuple doesn't work for one of my 4.7.2 projectsvaluetuple 不适用于我的 4.7.2 项目之一
【发布时间】:2019-06-10 03:40:22
【问题描述】:

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

【问题讨论】:

  • 在什么代码中报告了这个错误?这是完整且正确的错误信息吗?
  • 当我发布问题时,我更新了 err msg,试图隐藏类名,这会导致一些混乱,err msg 应该是 Error CS1061 'ValueTuple, Dictionary, Dictionary>' 不包含 'CreatedUsers' 的定义,并且没有扩展方法 'CreatedUsers' 接受类型为 'ValueTuple, Dictionary, Dictionary 的第一个参数>' 可以找到(您是否缺少 using 指令或程序集引用?)代码行错误:“var created = createUserResult.CreatedUsers;”
  • 我更新了原帖,以减少混乱
  • 再次检查您的代码。你确定你没有var created = createUserResult.CreatedUsers();
  • 不,我不知道。它是 var created = createUserResult.CreatedUsers

标签: c# .net valuetuple


【解决方案1】:

好的,我找到了原因。

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

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

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

现在问题已经解决了。

【讨论】:

    【解决方案2】:

    您的方法签名存在声明 ValueTuple 的语法错误。因为您不能在诸如Task&lt;T&gt; 之类的泛型类型声明中进行 ValueTuple 属性名称初始化。您在 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)
    

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

    【讨论】:

    • 元组没有属性,它们有命名值。而且错误与值的名称无关,而是与未声明的类型参数T有关。
    • T1 是具体类型,而不是泛型类型。我只是用 T1 替换了实际的类名
    猜你喜欢
    • 2012-01-04
    • 2020-07-08
    • 1970-01-01
    • 2015-04-09
    • 2019-08-02
    • 2015-12-07
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多