匿名方法返回类型强制转换

本文关键字:转换 返回类型 方法 | 更新日期: 2023-09-27 17:58:56

我有一个对象"ConnectableProperty",它将一个属性连接到另一个属性,并要求我为其提供Func。现在我有两种类型——标量和颜色。两者都可以通过显式运算符相互传递。由于某些原因,我无法将Func<double, double, Scalar>馈送到Func<double, double Color>,即使Scalar可以转换为Color。怎么回事?

为了澄清,我添加了代码。请注意,可连接属性是"输入"。输出(可以插入)是具有该签名的方法。

这是ConnectableProperty

public sealed class ConnectableProperty<T> : IEquatable<T>, IGetXY<T> where T : IValue<T>
{
    private T _value;
    public T Value { get { return _value; } set { _value = value; } }
    public INode ParentNode { get; private set; }
    public ValueConnection<T> Connection { get; set; }
    public INode ConnectionFrom { get { return !IsConnected ? null : Connection.FromNode; } }
    public bool IsConnected { get { return Connection == null; } }
    public ConnectableProperty(INode parentNode, T value)
    {
        ParentNode = parentNode;
        _value = value;
    }
    public T GetXY(double x, double y)
    {
        return IsConnected 
            ? Connection.FromValue(x, y) 
            : _value;
    }
    public void Connect(INode fromNode, Func<double, double, T> getXY)
    {
        Connection = new ValueConnection<T>(fromNode, ParentNode, getXY, this);
    }
    public void Disconnect()
    {
        Connection = null;
    }
    public bool Equals(T other)
    {
        return _value.Equals(other);
    }
    public static implicit operator T(ConnectableProperty<T> connectableProperty)
    {
        return connectableProperty._value;
    }
}

和ValueConnection:

public class ValueConnection<T>
{
    public INode FromNode { get; private set; }
    public INode ToNode { get; private set; }
    public Func<double, double, T> FromValue { get; private set; }
    public ConnectableProperty<T> ToValue { get; private set; }
    public ValueConnection(INode fromNode, INode toNode, Func<double, double, T> fromValue, ConnectableProperty<T> toValue)
    {
        // TODO: Implement INPC type thing
        FromNode = fromNode;
        ToNode = toNode;
        FromValue = fromValue;
        ToValue = toValue; 
    }
}

匿名方法返回类型强制转换

Jon是对的;只是为了增加:

首先,这不起作用的原因是没有转换的地方。假设你有:

Func<int> f1 = ()=>1;
Func<double> f2 = f1;

假设这是合法的。在某些地方,C#编译器必须生成一条指令,将int转换为double。哪里不在lambda中;当调用f1时,那个东西必须返回一个int。但在f2中也不是,因为f1是与f1相同的参考。有两种可能的解决方案:将其定为非法,或者使其真正意义上:

f2 = ()=>(double)f1();

使得f1和f2不再是相同的参考。我们选择了第一个解决方案。

其次,如果返回类型之间有一个隐式的引用转换,那么这在C#4中是合法的。我们不需要为隐式引用转换发出任何指令;它是合法的,没有任何特殊的代码。

不,您将无法直接执行转换,我也不希望能够执行,但您可以轻松地编写两种方法来为您执行转换:

public Func<double, double, Scalar> ConvertFunc(Func<double, double, Color func)
{
    return (x, y) => (Scalar) func(x, y);
}
public Func<double, double, Color> ConvertFunc(Func<double, double, Scalar func)
{
    return (x, y) => (Color) func(x, y);
}

当您有一个旨在返回特定类型的委托时,必须能够直接调用并返回适当类型的值。调用者不必知道,即使他们得到了Func<X>,如果他们想从中得到X,他们也需要将结果强制转换为X

难道不简单地在函数体内部使用显式转换来完成这项工作吗?然后u可以只使用一种类型的函数-不需要转换