不知道這是否是C#4+特定的,但只是注意到了這一點。重載分辨率奇怪
考慮下面的類:
class Base
{
protected void Foo(object bar, DayOfWeek day)
{
}
}
class Program : Base
{
protected void Foo(object bar, object baz)
{
}
void Bar(DayOfWeek day)
{
Foo(new { day }, day);
}
}
在Bar
到Foo
的調用,解析爲Foo(object, object)
。
雖然將其更改爲:在Bar
class Base
{
}
class Program : Base
{
protected void Foo(object bar, object baz)
{
}
protected void Foo(object bar, DayOfWeek day)
{
}
void Bar(DayOfWeek day)
{
Foo(new { day }, day);
}
}
到Foo
的調用,解析爲Foo(object, DayOfWeek)
。
我的理解是,它應該總是像第二個例子那樣解決。
這是一個'錯誤'還是我缺乏理解(或無知)?
更新:
感謝您的答案。正如我發現的那樣,可以使用base.
來調用基類中的方法。但是,在混合中添加另一個派生類時,問題會回來。
class Base
{
protected void Foo(object bar, DayOfWeek day)
{
}
}
class Program : Base
{
protected void Foo(object bar, object baz)
{
}
void Bar(DayOfWeek day)
{
base.Foo(new { day }, day);
}
}
class Derived : Program
{
void Baz(DayOfWeek day)
{
base.Foo(new { day }, day);
}
}
的base.
通話作品Program
,但隨後解析爲Foo(object, object)
在Derived
。
如何從Derived
調用Foo(object,DayOfWeek)
然後不必在Program
中創建「冗餘」方法?
我明白它看起來正在嘗試做什麼,但這意味着具有'object'參數的參數將否決所有其他重載,並且無法在基類中調用任何特定的重載,從而使繼承非常有限並容易出錯。 – leppie
謝謝,發現了'法律'。 *如果派生類中的任何方法適用,基類中的方法不是候選*。所以這是正常的...:*( – leppie
@lippie,我正要從相同的鏈接引用:) – Habib