gpt4 book ai didi

c# - 为什么我不能对 ThreadStart 使用/强制执行 Action?

转载 作者:太空狗 更新时间:2023-10-29 17:28:04 25 4
gpt4 key购买 nike

两者都是委托(delegate)并且具有相同的签名,但我不能将 Action 用作 ThreadStart。

为什么?

Action doIt;
doIt = () => MyMethod("test");
Thread t;

t = new Thread(doIt);
t.Start();

但这似乎有效:

Thread t;

t = new Thread(() => MyMethod("test"));
t.Start();

最佳答案

正如其他人所指出的,问题在于委托(delegate)类型不是“结构化的”。也就是说,基于它们的“结构”,它们不具有等价性。

现在,这对某些类型来说可以说是一件好事。如果你有

struct MyRectangle { int x; int y; int width; int height; ... }

struct YourRectangle { int x1; int y1; int x2; int y2; ... } 

显然,允许将 MyRectangle 的实例分配给 YourRectangle 的变量是错误的,因为它们都由四个整数组成。 int 的语义不同,因此类型不等同。

从理论上讲,委托(delegate)也是如此。你可以有

delegate int Pure(string x);
delegate int Func(string x);

其中“纯”函数是没有副作用且在给定相同输入的情况下具有相同输出的函数。由于每个 Pure 在逻辑上都是一个 Func,但每个 Func 不一定是 Pure,因此它们之间不应该有结构类型。

在实践中,类型系统当然不能很好地支持像“纯函数”这样的概念。在实践中,绝大多数在委托(delegate)类型之间进行转换的尝试都是非常安全的:从 Func<int, bool> 进行转换。到 Predicate<int>等等。

所以,有两件事,一件事向后看,一件事向前看。向后:如果我们必须重新做一遍,我认为委托(delegate)可能会在 CLI 中进行结构类型化。当你设计一个全新的框架时,你并不总是知道哪些特性会有用,而且到目前为止,非结构委托(delegate)类型并没有像预期的那样有用。转发:我希望在 CLR 的 future 版本中看到更多支持更多结构类型的功能。例如,C# 4 中的“no pia”特性是关于使语义和结构相同但在不同程序集中定义的两种类型在逻辑结构上统一。

关于c# - 为什么我不能对 ThreadStart 使用/强制执行 Action?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2488643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com