无法为值类型

时间:2017-12-19 20:33:12

标签: c# delegates value-type

我试图在Delegate.CreateDelegate方法上使用ToString()

它在引用类型上完全正常,但在值类型上失败。

这是我的测试代码:

using System;

class ReferenceType { }

struct ValueType { }

class Program
{
    static void Main(string[] args)
    {
        var referenceMethod = typeof(ReferenceType).GetMethod("ToString", Type.EmptyTypes);
        var referenceDelegate = (Func<ReferenceType, string>)Delegate.CreateDelegate(typeof(Func<ReferenceType, string>), referenceMethod);

        var valueMethod = typeof(ValueType).GetMethod("ToString", Type.EmptyTypes);
        var valueDelegate = (Func<ValueType, string>)Delegate.CreateDelegate(typeof(Func<ValueType, string>), valueMethod);

        Console.WriteLine(referenceDelegate.Invoke(new ReferenceType()));
        Console.WriteLine(valueDelegate.Invoke(new ValueType()));
    }
}

每当我尝试创建valueDelegate时,我都会遇到以下异常:

  

System.ArgumentException:&#39;无法绑定到目标方法,因为其签名或安全透明度与委托类型的方法不兼容。&#39;

然而,ValueType.ToString()存在并匹配Func<ValueType, String>的签名。

用任何原始类型(例如ValueType)替换int都会做同样的事情。

这个限制有什么理由吗?

如何创建委托?

编辑:在完成测试之后,似乎任何方法(不只是ToString)都会在值类型上失败,例如:

using System;

class ReferenceType
{
    public string Test() { return "Test"; }
}

struct ValueType
{
    public string Test() { return "Test"; }
}

class Program
{
    static void Main(string[] args)
    {
        var referenceMethod = typeof(ReferenceType).GetMethod("Test", Type.EmptyTypes);
        var referenceDelegate = (Func<ReferenceType, string>)Delegate.CreateDelegate(typeof(Func<ReferenceType, string>), referenceMethod);

        var valueMethod = typeof(ValueType).GetMethod("Test", Type.EmptyTypes);
        var valueDelegate = (Func<ValueType, string>)Delegate.CreateDelegate(typeof(Func<ValueType, string>), valueMethod);

        Console.WriteLine(referenceDelegate.Invoke(new ReferenceType()));
        Console.WriteLine(valueDelegate.Invoke(new ValueType()));
    }
}

0 个答案:

没有答案