TypeA
ve TypeB
'a bağlıdır. bunların tam bir geçerli ise, arama geçerli bir yapılacaktır
- (bir değer türü ama
TypeA
başvuru türü olduğu için, örneğin TypeB
için null
hiçbir dönüşüm yoktur). Aksi takdirde TypeA
ve TypeB
arasındaki ilişkiye bağlıdır.
- sonra
TypeA
kullanarak aşırı yük kullanılacaktır TypeA
den TypeB
bir örtük dönüştürme ama TypeB
TypeA
ila örtülü hiçbir dönüşüm yoksa.
- sonra
TypeB
kullanarak aşırı yük kullanılacaktır TypeB
den TypeA
bir örtük dönüştürme ama TypeA
TypeB
ila örtülü hiçbir dönüşüm yoksa.
- Aksi takdirde, arama belirsizdir ve derlenemez.
bak Bölüm detaylarını öğrenmek için C# 3.0 spec 7.4.3.4.
İşte bunun bir örneği belirsiz değil. Burada TypeB
, TypeA
türetilmiştir, yani TypeB
ile TypeA
arasındaki örtük bir dönüşüm var, ancak bunun tersi de doğru değil. Böylece TypeB
kullanılarak aşırı kullanılır: Genel olarak
using System;
class TypeA {}
class TypeB : TypeA {}
class Program
{
static void Foo(TypeA x)
{
Console.WriteLine("Foo(TypeA)");
}
static void Foo(TypeB x)
{
Console.WriteLine("Foo(TypeB)");
}
static void Main()
{
Foo(null); // Prints Foo(TypeB)
}
}
, hatta bir başka şekilde belirsiz çağrı karşısında belirli bir aşırı yük kullanıldığından emin olmak için, sadece döküm:
Foo((TypeA) null);
veya
Foo((TypeB) null);
Bu, bildirme sınıflarında kalıtımı içeriyorsa (yani, bir sınıf, temel sınıfı tarafından bildirilen bir yöntemi aşırı yüklüyorsa), başka bir soruna girdiğiniz ve argümandan ziyade yöntemin hedefini yayınlamak.
diğeri çağırabilir. –