[英]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.