Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;“动态”;匿名代表?_C#_Dynamic_Delegates_Anonymous Delegates - Fatal编程技术网

C# &引用;“动态”;匿名代表?

C# &引用;“动态”;匿名代表?,c#,dynamic,delegates,anonymous-delegates,C#,Dynamic,Delegates,Anonymous Delegates,我想知道是否有可能使变量的“动态”类型适用于匿名委托 我尝试了以下方法: dynamic v = delegate() { }; 但随后我收到了以下错误消息: 无法将匿名方法转换为“dynamic”类型,因为它不是委托类型 不幸的是,以下代码也不起作用: Delegate v = delegate() { }; object v2 = delegate() { }; 如果我想使一个方法接受任何类型的委托,即使是内联声明的委托,我该怎么办 例如: class X{ public voi

我想知道是否有可能使变量的“动态”类型适用于匿名委托

我尝试了以下方法:

dynamic v = delegate() {
};
但随后我收到了以下错误消息:

无法将匿名方法转换为“dynamic”类型,因为它不是委托类型

不幸的是,以下代码也不起作用:

Delegate v = delegate() {
};
object v2 = delegate() {
};
如果我想使一个方法接受任何类型的委托,即使是内联声明的委托,我该怎么办

例如:

class X{
    public void Y(dynamic d){
    }
    static void Main(){
        Y(delegate(){});
        Y(delegate(string x){});
    }
}

这是可行的,但看起来有点奇怪。您可以给它任何委托,它将运行它并返回一个值

您还需要在某个时刻指定匿名方法签名,以便编译器理解它,因此需要指定
Action
Func
或其他内容

static void Main(字符串[]args)
{
动作d=()=>Console.WriteLine(“Hi”);
执行(d);//打印“Hi”
动作d2=(s)=>控制台写入线;
执行(d2,“Lo”);//打印“Lo”
函数d3=(s)=>
{
控制台。写入线(s);
返回“完成”;
};
var result=(string)Execute(d3,“Spaghettio”);//打印“Spaghettio”
Console.WriteLine(结果);//打印“完成”
Console.Read();
}
静态对象执行(委托d,参数对象[]args)
{
返回d.DynamicInvoke(args);
}

如果为每个代理声明一个类型,则该类型有效

// Declare it somewhere
delegate void DelegateType(string s);

// The cast is required to make the code compile
Test((DelegateType)((string s) => { MessageBox.Show(s); }));

public static void Test(dynamic dynDelegate)
{
    dynDelegate("hello");
}

有没有不使用
Func
Action
的理由?@Jamiec我想是因为这不符合不关心代表签名的标准。这就是说,它可以归结为使用参数的
对象[]
调用Invoke,然后可以用
Func
表示。你没有在那里声明任何委托类型。@AdamHouldsworth-是的,重读了这个问题,我现在明白了,但这没有多大意义。您必须对委托执行某些操作,这意味着您的程序必须理解委托的I/O。@因为Func和Action有固定的参数计数/类型。每次都必须指定它。我不想这样做。你能把
Execute
的第二个参数改成
params
让它看起来不那么奇怪吗?看:这是我已经得到的。这里的问题是,我必须为要执行的每个委托指定操作的签名。有了这个问题,我想找到一种方法来避免这种情况。我想不出一种方法来避免这种情况,但也就是说,这不会有什么关系,也不会产生任何问题。你知道签名是什么,因为你是在线创建签名的,你只需要在将其交给方法之前将其强制转换为该签名。@Adamhuldsworth这很遗憾,因为指定它对我来说似乎完全没有必要。。。这使得整个代码非常尴尬。。。没有开发人员希望定义两次类型。。。这不是知道类型的问题,而是代码设计的问题。@VanCoding这可能与您不能将lambda分配到
var
中的原因相同。因此,在将匿名委托传递给测试之前,我必须先强制转换每个匿名委托?是的,否则它将无法编译。请在代码中添加解释,以便于理解。
// Declare it somewhere
delegate void DelegateType(string s);

// The cast is required to make the code compile
Test((DelegateType)((string s) => { MessageBox.Show(s); }));

public static void Test(dynamic dynDelegate)
{
    dynDelegate("hello");
}
Action _;
dynamic test = (_ = () => Console.WriteLine("Test"));
test() // Test