簡體   English   中英

運算符使用泛型函數參數重載

[英]Operator overloading with generic function parameters

我對泛型方法的運算符解析有問題。

根據我對函數EqualOperatorGeneric中規范7.3.4節的理解(下面的示例代碼),應該找到類型A上的==運算符的正確重載,但它似乎得到(對象,對象)的候選者。

我做了一件非常明顯錯誤的事嗎? 有沒有一種方法可以獲得預期的行為,如果沒有,我可以將給定的情況轉換為編譯時或運行時錯誤嗎?

public class A
{
    public A(int num)
    {
        this.Value = num;
    }

    public int Value { get; private set; }

    public override bool Equals(object obj)
    {
        var other = obj as A;
        if (Object.ReferenceEquals(other, null))
            return false;

        return Object.Equals(this.Value, other.Value);
    }

    public override int GetHashCode()
    {
        return this.Value.GetHashCode();
    }

    public static bool operator ==(A l, A r)
    {
        if (Object.ReferenceEquals(l, null))
        {
            return !Object.ReferenceEquals(r, null);
        }

        return l.Equals(r);
    }

    public static bool operator !=(A l, A r)
    {
        return !(l == r);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(EqualOperatorGeneric(new A(1), new A(1)));
    }

    public static bool EqualOperatorGeneric<L, R>(L l, R r)
        where L : class
        where R : class
    {
        return l == r;
    }
}

輸出:

編譯EqualOperatorGeneric==運算符需要在編譯方法時靜態綁定到單個實現。 對於通用方法的每個單獨使用,它不單獨綁定。

這就是將泛型與C ++模板區分開來的原因。 泛型方法編譯一次 ,然后應用於每個類型參數集的每個用法,而模板則為每組泛型參數單獨編譯。

在瀏覽規范之后,我意識到您可以使用dynamic關鍵字將運算符的綁定從編譯時延遲到運行時。 這解決了我一直遇到的問題:

public static bool EqualOperatorGeneric<L, R>(L l, R r)
{
    dynamic dl = l, dr = r;
    return dl == dr;
}

暫無
暫無

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

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