2011-03-11 10 views
22

Jon Skeet'in "Depth, 2nd Edition" adlı kitabını okuyorum. O az önce o "sen örtülü this değeri olarak dinamik değeri ile uzatma yöntemi çağırmak istiyorsanız Her iki yaklaşım çalışacaktır" dedi SonraDinamik türden bir uzantı yöntemi nasıl aranır?

dynamic size = 5; 
var numbers = Enumerable.Range(10, 10); 
var error = numbers.Take(size); 
var workaround1 = numbers.Take((int) size); 
var workaround2 = Enumerable.Take(numbers, size); 

gibi iki geçici çözüm kullanarak dinamik argümanlarla uzatma yöntemleri çağırabilir söyledi . Bunu nasıl başaracağımı bilmiyorum.

Çok teşekkürler. Bunun gibi

+11

Dostum, şimdi bu sadece bilet değil mi? Jon Skeet'in bir kitabını okuyorsun ve Jon Skeet’in belirsiz olduğun bir şey hakkında bir cevap al. –

+4

Bir jon-skeet etiketine ihtiyacımız var mı? – Myster

cevap

38

: Başka bir deyişle

dynamic numbers = Enumerable.Range(10, 10); 
var firstFive = Enumerable.Take(numbers, 5); 

, sadece statik yöntem olarak yerine bir uzantısı yöntemi olarak diyoruz.

Ya Uygun bir tür bağımsız değişkeni bilmek eğer sadece ekstra bir değişken ile bunu tipik ediyorum ki, bunu döküm olabilir: Dinamik türleri ile uğraşıyoruz

dynamic numbers = Enumerable.Range(10, 10); 
var sequence = (IEnumerable<int>) numbers; 
var firstFive = sequence.Take(5); 

... ama sıralı eleman türünü iyi bilmezsiniz, bu durumda ilk sürüm, temel olarak "yürütme zamanı derleyicisi" nin bunu çözmesini sağlar.

+1

muhtemelen yapabilecekleriniz: ((IEnumerable ) numaraları) .Take (5)? – Massif

+1

@Massif: Evet, bunu da yapabilirsin. Düzenleyecek –

3

Uzatma yöntemi sadece sözdizimsel bir şekerdir, C# derleyicisi tarafından çağrılan normal bir yöntem olarak dönüştürülür. Bu dönüşüm, geçerli sözdizimi bağlamına bağlıdır (Hangi ad alanları deyim kullanılarak alınır).

Dinamik değişken, çalışma zamanına göre işlemdir. Bu kez, CLR hangi uzantı yönteminin kullanıldığına karar vermek için yeterli sözdizimi bağlam bilgisini alamaz. Yani, bu iş değil.