SORU
18 Ocak 2012, ÇARŞAMBA


C# geçersiz yöntemleri isteğe bağlı parametreler

Gibi görünüyor .NET Çerçeve var senin yöntemini geçersiz kılmak için isteğe bağlı parametreler ile ilgili bir sorun. Kodun çıktısı aşağıda: "bbb" "aaa" . Ama beklediğim çıktı: "bbb" "bbb" .Bunun için bir çözüm var. Metot aşırı yükleme ile çözüldü ama bunun nedeni merak olabilir biliyorum. Ayrıca kodu Mono gayet iyi çalışıyor.

class Program
{
    class AAA
    {
        public virtual void MyMethod(string s = "aaa")
        {
            Console.WriteLine(s);
        }

        public virtual void MyMethod2()
        {
            MyMethod();
        }
    }

    class BBB : AAA
    {
        public override void MyMethod(string s = "bbb")
        {
            base.MyMethod(s);
        }

        public override void MyMethod2()
        {
            MyMethod();
        }
    }

    static void Main(string[] args)
    {
        BBB asd = new BBB();
        asd.MyMethod();
        asd.MyMethod2();
    }
}

CEVAP
18 Ocak 2012, ÇARŞAMBA


Çağırarak, belirsizliği ortadan kaldırmak

this.MyMethod();

(MyMethod2())

Bir hata olup olmadığını zordur; tutarsız, ama görünüyor. Resharper sadece, resharper uyarıyorayrıcasöyler misin this. gereksiz ve davranış değişiklikleri için kaldırmak fazla ... - resharper da mükemmel değil.

Öyle görünmüyorolabilirderleyici bir hata olarak nitelemek, seni temin ederim. Bakmak lazımgerçektenona ihtiyacın olduğunda emin olmak için... Eric nerede, dikkatle değil mi?


Düzenleme:

Burada kilit nokta dil işlevi görür; hadi §7.5.3 bak:

Örneğin, set adayları için bir yöntem çağırma içermez yöntemleri işaretli geçersiz kılma (madde 7.4) ve yöntemleri bir temel sınıf değildir adaylar ise herhangi bir yöntem, bir türetilmiş sınıf geçerlidir (§7.6.5.1).

(ve aslında §7.4 açıkça göz arası override yöntemleri atlar)

Burada biraz çelişki var.... bu devletlertabanyöntemleri ise, bize yol açacak olan türetilmiş bir sınıf içinde uygulanabilir bir yöntem varsa kullanılırtüretilmişyöntem, ama aynı zamanda, yöntemleri override işaretli olarak kabul edilmez diyor.

Ama devletler, §7.5.1.1:

Sanal yöntemleri ve dizin oluşturucu tanımlanan sınıfları, parametre listesi seçilmiş en özel beyan veya geçersiz kılma işlevi üyesi ile başlayan statik tip alıcı ve arama yoluyla temel sınıflar.

ve sonra da §7.5.1.2 değerleri çağırma: zamanda nasıl değerlendirileceğini açıklar

İşlevi bir üye çağırma çalıştırma işleme (madde 7.5.4) sırasında, argüman listesinin ifadesi veya değişken başvuruları şöyle: soldan sağa sırayla değerlendirilir

...(kelepir)...

Tartışmalar karşılık gelen isteğe bağlı parametreler ile işlevi bir üye ihmal edildiğinde, işlevi üye bildirimi varsayılan bağımsız değişkenleri örtülü olarak geçti. Bu her zaman sabit olduğundan, değerlendirme, geri kalan bağımsız bir değerlendirme sırasını etkilemez.

Bu açıkça daha önce gelen §7.5.1.1 tanımlanmış olan değişken listesi, bakıyor olduğunu vurgularen belirgin Beyannamesi veya geçersiz kılar. Bu "" değer geçirilmesi böylece §7.5.1.2, en türetilmiş-statik türü. adı verilir bu beyanname yöntemi uygun görünmektedir

Bunu öneririm: csc bir hata var, ve bu kullanarak olmalıdırtüretilmiş("bbb bbb" sınırlı) (base., ya da baz türü bir çevrim) temel yöntem bildirimleri (§7.6.8) bakarak sürece. sürüm

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • Jason Rosolowski

    Jason Rosolo

    25 EKİM 2006
  • TheOtherMau5

    TheOtherMau5

    6 Mart 2012