Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 如何通过.NET 2上的操作修复此协方差问题?_C#_.net_Covariance - Fatal编程技术网

C# 如何通过.NET 2上的操作修复此协方差问题?

C# 如何通过.NET 2上的操作修复此协方差问题?,c#,.net,covariance,C#,.net,Covariance,我需要用一个方法创建一个协变接口,该方法接受一个具有协变泛型参数的委托。下面是有问题的代码示例: interface IExample<out T1> { void ExampleMethod(Action<T1> someAction); } 接口示例 { void example方法(Action someAction); } 在Mono/.NET4配置文件上,它编译正常(在Xamarin studio中进行了测试)。然而,在.NET 2上(由于使用Uni

我需要用一个方法创建一个协变接口,该方法接受一个具有协变泛型参数的委托。下面是有问题的代码示例:

interface IExample<out T1>
{
    void ExampleMethod(Action<T1> someAction);
}
接口示例
{
void example方法(Action someAction);
}
在Mono/.NET4配置文件上,它编译正常(在Xamarin studio中进行了测试)。然而,在.NET 2上(由于使用Unity游戏引擎,我不得不使用它),我得到以下错误:

错误CS1961:协变类型参数“T1”必须在“协变示例.IExample.ExampleMethod(System.Action)”上始终有效

为什么在早期的.Net版本中会发生此错误?我怎样才能修好它

为什么在早期的.Net版本中会发生此错误

因为
Action
在.NET2.0(或3.5)中不是逆变的

我怎样才能修好它

不要使用.NET2.0:)我认为Unity的现代版本是基于Mono的最新版本的——也许可以升级

或者,您可以声明自己的
contravariationOn
delegate:

public delegate void ContravariantAction<in T>(T value);
public委托无效抵销(T值);

我还没有尝试过对.NET 2.0这样做,但我相信适当的属性已经存在,而且至少MS.NET实现支持通用变体-它没有在C#中公开,也没有在BCL中使用。

当我使用Unity game engine时,我认为我不应该添加unity3d标记,因为这个问题对于Unity并没有什么特别的意义,对于那些因为其他原因而使用早期版本的.Net的人来说可能会很有用。非常感谢您的回答!虽然它需要一些时间才能正常工作,但它与问题本身无关(我有一个事件字段,在协变类中使用它会导致运行时出现神秘的异常)。