gpt4 book ai didi

c# - 在C#中调用Invoke()有统一的方法吗?

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

下面的测试通过了,但是我想知道是否可以统一处理。可以吗?

public abstract class MyInvokable<TResult> {
public abstract TResult Invoke();
}
public class IntInvokable: MyInvokable<int> {
public override int Invoke() {
return 12;
}
}
[Test()]
public void FunctionInvokeTest () {
Func<int> foo = () => 6;
IntInvokable bar = new IntInvokable();
int six = foo.Invoke();
int twelve = bar.Invoke();
Assert.AreEqual(6, six);
Assert.AreEqual(12, twelve);
/* Now, what I really want to do but can't, as far as I can tell:
List<SomeType> list = new List<SomeType>(){foo, bar};
Assert.AreEqual(6, list[0].Invoke());
Assert.AreEqual(12, list[1].Invoke()); */
}

编辑:在此处向 Microsoft 发起功能请求: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/10185579-create-an-iinvokable-t-interface

最佳答案

C# 不允许任何类似这种动态行为的行为。

但是,如果您确实需要走这条路,您始终可以使用 dynamic,基本上向编译器发出所有赌注都关闭的信号。这会起作用:

 List<dynamic> list = new List<dynamic>(){foo, bar};
Assert.AreEqual(6, list[0].Invoke());
Assert.AreEqual(12, list[1].Invoke());

但是您不能以任何方式保证 list 变量中的内容实际上具有 Invoke 方法。

最像这个的特性是 TypeScript 的结构化接口(interface)——只要一个类型拥有接口(interface)所需的所有方法/属性,就认为它实现了接口(interface)。在 C# 中,可以将两个不同的事物视为具有相似类型的唯一方法是让它们显式声明它们实现相同的接口(interface),或继承相同的基类。

能够以某种方式在 C# 中具有结构语义会很好,但它甚至不在路线图上,AFAIK。

关于c# - 在C#中调用Invoke()有统一的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33095609/

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