gpt4 book ai didi

c# - 分配给委托(delegate)的通用方法

转载 作者:可可西里 更新时间:2023-11-01 08:23:22 27 4
gpt4 key购买 nike

我对委托(delegate)和泛型方法有点困惑。

是否可以将委托(delegate)分配给具有泛型类型参数的方法?

即:

//This doesn't allow me to pass a generic parameter with the delegate.
public delegate void GenericDelegate<T>()

someDelegate = GenericMethod;
public void GenericMethod<T>() where T : ISomeClass
{

}

我正在尝试将此委托(delegate)传递给具有该方法所期望的通用接口(interface)类型的函数,函数如下:

void CheckDelegate(GenericDelegate<ISomeClass> mechanism);

这样我就可以像这样使用委托(delegate):

someDelegate<ImplementsSomeClass>();

最佳答案

你的问题没有意义,因为你永远不能使用开放泛型类型来声明存储位置(如局部变量或字段)。它必须始终关闭。

我知道你想传递 GenericDelegate<T>以这样的值作为参数的方法。但即便如此,委托(delegate)类型也会以 T 关闭。作为泛型类型参数。

在您编写的示例代码中

someDelegate = GenericMethod;

但是 someDelegate 是什么类型应该有?它必须明显关闭( GenericDelegate<string> )或使用来自外部范围的通用类型参数关闭:

void SomeOuterMethod<T>() where T : ISomeClass {
GenericDelegate<T> someDelegate = GenericMethod<T>;
}

希望我理解您的问题。如果不是,请澄清。如果您详细说明您想要完成什么,我会尝试提出一个实用的解决方案。

Haskell 等其他语言确实支持传递开放泛型类型的值(换句话说,您可以拥有类型为 IEnumerable<> 的变量)。这是实现 monad 所必需的。 CLR 没有该功能。


新想法:你可以创建一个非泛型基类型,它带有一个可以被覆盖的泛型方法,而不是一个委托(delegate):

interface CheckHandler {
public void Check<T>(T someArg);
}

希望涵盖您的情况。您不能随意传递任何 CheckHandler大约。它的Check然后可以使用任意类型的参数调用方法。

关于c# - 分配给委托(delegate)的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20449639/

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