2016-04-12 33 views
0

Bu kodu vardı:Resharper neden bir kod değişikliği öneriyor ve sonra değişiklik hakkında şikayet ediyor?

return children.SelectMany(c => GetChildControls<TControl>(c)).Concat(children); 

... ve Resharper Ben buna değiştirmek önerdi:

return children.SelectMany(GetChildControls<TControl>).Concat(children); 

bağlamda:

internal static IEnumerable<TControl> GetChildControls<TControl>(this Control control) where TControl : Control 
{ 
    var children = control.Controls != null ? control.Controls.OfType<TControl>() : Enumerable.Empty<TControl>(); 
    return children.SelectMany(GetChildControls<TControl>).Concat(children); 
} 

farkı, muhtemelen gördüğümüz gibi satırın "geliştirilmiş" versiyonunun eklenmiş "(c)"

Ama şimdi şüpheli olarak, "Olası çoklu numaralandırma IEnumerable" diyerek işaretler.

Evet, doğru, birden fazla olabilir/olmalı, ama neden bu konu hakkında? Onu önceki durumuna geri döndürmeli miyim?

+0

Tahminimce, Resharper'ın her satır için bir kerede önereceği kod değişikliklerinin sayısını sınırlaması vardır. "Mümkün çoklu numaralandırma" sorunu, kodun her iki sürümünde mevcuttur, ancak Resharper yalnızca "iyileştirme" yapıldığında ve mesajın kaybolduğunda görüntülenir. –

cevap

2

ReSharper'ın sizin için yakaladığı sorun, iki kez children numaralandırmanızdır. Spesifik olarak, children.SelectMany(GetChildControls<TControl>)'u ilk kez aradığınızda children'u ve bununla ilgili olarak .Concat(children)'u aradığınızda bir kez daha numaralandırırsınız. ReSharper bu konuda sizi uyarır, çünkü her bir numaralandırma farklı sonuçlarla sonuçlanabilir veya her bir numaralandırma maliyetli olabilir. Daha fazla ayrıntı için bkz. this question.

bir çözüm children (tabii ki, bunu kendiniz mutasyona, sürece) oluşturduktan sonra yöntem içinde değişebilir ve sadece bir kez sayılan olacağını olmayacak emin olur

internal static IEnumerable<TControl> GetChildControls<TControl>(this Control control) where TControl : Control 
{ 
    var children = control.Controls.OfType<TControl>().ToList(); 
    return children.SelectMany(GetChildControls<TControl>).Concat(children); 
} 

olurdu.

+0

Kodunuz ile, "Yöntem için tür argümanları" System.Linq.Enumerable.SelectMany (System.Collections.Generic.IEnumerable , System.Func >) 'kullanımdan çıkar çıkarılamaz. Tür bağımsız değişkenlerini belirtmeyi deneyin. \t " –

+0

Bunun için üzgünüz! Uzantı yönteminizin "bu TControl" yerine "bu Kontrol" olduğunu fark etmedim. Güncellenmiş cevap çalışması – AGB