簡體   English   中英

匿名方法返回類型轉換

[英]Anonymous method return type casting

我有一個 object “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;
    }
}

和價值連接:

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; 
    }
}

喬恩是對的; 只是補充一點:

首先,這不起作用的原因是因為沒有轉換存在的地方。 假設你有:

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

僅僅使用 function 主體內部的顯式轉換不能完成這項工作嗎? 然后你可以只使用一種類型的 function - 不需要鑄造

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM