C#7 值元组/解构不对称

2024-01-15

在这里摆弄 https://dotnetfiddle.net/9Ex5Jp.

给定一个函数(string a, string b) F(),您可以解构它返回的元组:

var (a, b) = F();

(string c, string d) = F();

或者你可以直接分配它:

var (a, b) e = F();

(string a, string b) f = F();

var g = F();  //  One of these things is not like the others.

类解构函数的行为类似于第一种情况。给定一个类C with Deconstructor(out string a, out string b):

var c = new C();

var (h, i) = c;

(string j, string k) = c;

但编译器不会使用解构函数将其隐式转换为元组:

//  Cannot implicitly convert type 'C' to '(string a, string b)'
var (a, b) l = c;

显然,您可以基于解构函数机械地编写隐式转换:

public static implicit operator (string a, string b) (C c)
{
    c.Deconstruct(out string a, out string b);
    return (a, b);
}

尽管解构和赋值情况之间的语法在视觉上相似,但分配对元组的引用与将类解构为变量然后将它们放入新元组中不同。但是,您可以隐式转换(int x, int y) to (double x, double y)。值元组是一种语法糖功能,它看起来就像它所做的那样,而不用担心实现细节。

If I thought of this, the C# team thought of it, and if they chose not to add "magic" support for the implicit conversion, they had a good reason1.

是否有积极的理由为什么自动进行隐式转换是一个坏主意?

或者它是否是那些被认为价值不足以证明其成本合理的功能之一?


这是来自的代码那个小提琴 https://dotnetfiddle.net/9Ex5Jp:

public class Program
{
    public static void Main()
    {
        (string a, string b) = F();

        (string a, string b) ab = F();

        Console.WriteLine($"a: {a} b: {b} ab: {ab}");


        var c = new C();

        (string d, string e) = c;

        //  Cannot implicitly convert type 'C' to '(string a, string b)'
        (string a, string b) f = c;

        Console.WriteLine($"d: {d} e: {e} f: {f}");

        //  Covariance
        (object c, object d) g = F();
        //  Implicit conversion
        (double x, double y) t = G();
    }

    public static (string a, string b) F() 
        => ("A", "B");

    public static (int x, int y) G() 
        => (0, 1);
}

public class C
{
    public String A = "A";
    public String B = "B";

    public void Deconstruct(out String a, out String b)
    {
        a = A;
        b = B;
    }
}

1 The C# team may not be smarter than everybody, but I've never lost money betting they were at least as smart as me.


在 C# 7 发布之前,人们就要求让解构像隐式转换器一样工作(所以我在这里有偏见)。团队的回应是(正如我读到的那样),它被要求太接近 C# 7 版本,并且需要很长时间才能实现,因此没有考虑。由于现在这将是一个重大变化,因此它永远不会发生。

请参阅“允许解构和隐式运算符都支持解构和转换为元组类型 https://github.com/dotnet/roslyn/issues/16295“ roslyn repo 问题用于对此事进行实际讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#7 值元组/解构不对称 的相关文章

随机推荐

  • C 堆栈中的递归[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 这是合并排序中分区的代码 我实际上无法理解 reusrion 在其中是如何工作的 合并排序分区 void partition int arr
  • 7z 命令行压缩文件夹

    我正在尝试使用 7zG exe 的命令行来压缩 7z 文件夹 我的代码适用于文件 但不适用于文件夹 有人可以告诉我使用 7z 命令行压缩文件夹的正确方法吗 以下是仅适用于文件的示例代码 每当我尝试运行此代码时 7zip 都会显示一个消息框
  • 如何在matlab中编写指标函数

    我是 matlab 的新用户 我想解决以下问题 我想构造一个分段常数函数f f应该是一个匿名函数 例如f t 1 0 0 25 t 然而 分段常数函数的区间数一般不固定 相反 分段间隔取决于用户输入 例如 如果输入4 则分段间隔变为 0 0
  • WooCommerce 在订单状态完成时触发功能

    我试图在订单完成时触发一个功能 我正在使用这段代码 add action woocommerce order status completed array this payment complete 1 然后这个函数 public func
  • 异步等待进度报告不起作用

    我有一个 C WPF 程序 它打开一个文件 逐行读取它 操作每一行 然后将该行写入另一个文件 那部分工作得很好 我想添加一些进度报告 因此我将方法设为异步 并将 wait 与进度报告结合使用 进度报告非常简单 只需更新屏幕上的标签即可 这是
  • 从 RSA .pem 文件获取私钥 [重复]

    这个问题在这里已经有答案了 鉴于这种 pem文件 使用 openssl 生成并使用密码加密 BEGIN RSA PRIVATE KEY Proc Type 4 ENCRYPTED DEK Info DES EDE3 CBC AC009672
  • 在注释视图上使用 canShowCallout 时出现 MKMapKit 异常

    我正在尝试使用非常简单的自定义地图注释视图和标注 创建注释视图时 只需将 UIImageView 作为子视图添加到其自身 效果很好 但是 当我在注释视图上调用 canShowCallout 时 返回视图后立即在 MapKit 中引发异常 堆
  • 在数据库中记录 ActionMailer 发送的电子邮件的最佳方式?

    我需要记录通过 ActionMailer 发送的电子邮件 而简单的文本文件是不够的 我需要将日志存储在 ActiveRecord 模型中 电子邮件发送性能可能会受到影响 但在这种情况下 这是最好的选择 因为应用程序随后会定期访问日志 我还需
  • 合并android清单文件,过滤器冲突

    我正在尝试合并 Unity 中 2 个插件的 Android 清单文件 但是有两个活动具有相同的意图过滤器 我只能让其中一个同时工作 在这 2 个冲突的活动中 清单文件中位于顶部的活动有效 因此 如果清单 1 中的活动位于顶部 则插件 1
  • 为什么 bash 没有捕获来自 Java 的 process.destroy() 的信号[重复]

    这个问题在这里已经有答案了 用于测试的脚本 The script below just hangs until you press Ctrl C then it takes two seconds to shut down I wrote
  • std::function 的类型推导

    以下代码不会编译 因为在编译时未调用匹配的 std function 构造函数 template
  • Windows - 直接运行 .py 与运行 python blah.py 的行为不同

    我有一个使用子进程的 python 脚本 import subprocess print Running stuff subprocess check call do stuff bat print Stuff run 如果它被命名为 bl
  • 如何使用 FB.ui Javascript sdk 在 Facebook 上上传视频

    我正在使用 FB ui 方法将图像发布到 facebook 如下所述 FB ui display popup method feed name image link link picture image path caption capti
  • Spark集群中RDD映射函数内部调用函数

    我正在测试我在代码中定义的一个简单的字符串解析器函数 但其 中一个工作节点在执行时总是失败 这是我一直在测试的虚拟代码 JUST A SIMPLE PARSER TO CLEAN PARENTHESIS def parseString fi
  • Android BATTERY_PROPERTY_ENERGY_COUNTER 返回固定值?

    我的应用程序每 5 秒在工作线程中运行以下代码 但它返回固定值 9223372036854775808 我错过了什么吗 BatteryManager batteryManager BatteryManager context getSyst
  • Symfony2 明文用户不起作用

    我尝试通过将其配置到 secure yml 中来配置一个简单的安全管理区域 我使用了 Symfony 的例子 security firewalls secured area pattern anonymous http basic real
  • 当数据可用时,组合框自动选择第一项

    我正在寻找在数据可用时选择第一项的方法 但如果源中没有数据 则不要选择 怎么做 我对 WPF 很陌生
  • 使用 @babel/preset-typescript 从环境 TypeScript 模块中使用枚举?

    是否可以食用enum来自正在编译的文件babel using babel preset typescript mymodule d ts declare module mymodule export enum Fruit apple App
  • 表达式中括号组的 ISO C 等效项

    如何以符合 ISO C99 的方式执行以下操作 define MALLOC type length message type a LINE type malloc length sizeof type assert message a LI
  • C#7 值元组/解构不对称

    在这里摆弄 https dotnetfiddle net 9Ex5Jp 给定一个函数 string a string b F 您可以解构它返回的元组 var a b F string c string d F 或者你可以直接分配它 var