How can I this fix covariance issue with Action on .NET 2?

I need to create a covariant interface with a method that takes a delegate with covariant generic parameter. Here's the code sample under question:

interface IExample<out T1>
{
    void ExampleMethod(Action<T1> someAction);
}

On Mono/ .NET 4 profile it compiles OK (tested it in Xamarin studio). However, on .NET 2 (which I'm forced to use since I'm using Unity game engine), I get the following error:

error CS1961: The covariant type parameter 'T1' must be invariantly valid on `CovarianceExample.IExample.ExampleMethod(System.Action)'

Why does this error occur in early .Net versions? How can I fix it?

Jon Skeet
people
quotationmark

Why does this error occur in early .Net versions?

Because Action wasn't contravariant in .NET 2.0 (or 3.5).

How can I fix it?

Don't use .NET 2.0 :) I thought that modern versions of Unity were based on more recent versions of Mono anyway - perhaps an upgrade is available?

Alternatively, you could declare your own ContravariantAction delegate:

public delegate void ContravariantAction<in T>(T value);

I haven't tried doing so against .NET 2.0, but I believe the appropriate attributes were already present, and at least the MS .NET implementation supported generic variance - it just wasn't exposed in C# or used in the BCL.

people

See more on this question at Stackoverflow