SORU
29 Mayıs 2013, ÇARŞAMBA


't ön Null türü ile operatör davranış azaltma anlamış değilim

Tamam, bu biraz sizin için açık olabilir ama oldukça basit bu kodu alıyorum davranışı ile tıkandım:

public static void Main(string[] args)
{
    int? n = 1;
    int i = 1;
    n =   n - --i;
    Console.WriteLine("Without Nullable<int> n = {0}", n); //outputs n = 2

    n = 1;
    i = 1;
    n =   n - new Nullable<int>(--i);
    Console.WriteLine("With Nullable<int> n = {0}", n); //outputs n = 3
    Console.ReadKey();
}

Her iki çıkışları aynı olduğu ve 2 eşit ben exepcted ama garip bir şekilde yeterli gelmiyor. Neden birisi açıklayabilir mi?

DÜZENLEME:Ancak kodu oluşturmak için bu "garip" davranış kuşkusuz yapmacık gibi duruyor bir hata C# derleyici gerçi önemsiz görünen sebep olacak gibi görünüyor inlined new James başlangıçta dikkat çekti. Ama bu davranış işlemleri ile sınırlı değildir. Yöntem tam olarak sadece bir kez ne zaman onlar iki kez aradı onlar da aynı şekilde, yani, davranmaya çağırır.

Düşünün aşağıdaki yeniden oluşturma:

public static void Main()
    {
        int? n = 1;
        int i = 1;
        n = n - new Nullable<int>(sideEffect(ref i));
        Console.WriteLine("With Nullable<int> n = {0}", n);
        Console.ReadKey();
    }

    private static int sideEffect(ref int i)
    {
        Console.WriteLine("sideEffect({0}) called", i);
        return --i;
    }

Emin yeterli, çıkış 1 olması gereken 2 ve "sideEffect(i) called" iki kez yazdırılır.

CEVAP
29 Mayıs 2013, ÇARŞAMBA


DÜZENLEME:Bu ekip tarafından derleyici bir hata olarak teyit edilmiştir. Roslyn sabit. Geçici bir çözüm olarak, bir döküm (int?)(--i) böcek görünmesini durdurmak için kullanın, ya da açıkça ilk etapta Nullable<int> bir döküm yok.

İlk kod bloğu reflektör aşağıdakileri oluşturur:

int? nullable3;
int? nullable = 1;
int num = 1;
int? nullable2 = nullable;
nullable2 = nullable = nullable2.HasValue
    ? new int?(nullable2.GetValueOrDefault()   1)    
   : ((int?) (nullable3 = null));
int num2 = --num;
nullable = nullable2.HasValue
    ? new int?(nullable2.GetValueOrDefault() - num2)
    : ((int?) (nullable3 = null));
Console.WriteLine("Without Nullable<int> n = {0}", nullable);

İkincisi ise şu:

nullable = 1;
num = 1;
nullable2 = nullable;
nullable2 = nullable = nullable2.HasValue
    ? new int?(nullable2.GetValueOrDefault()   1)
    : ((int?) (nullable3 = null));
num2 = --num;
nullable = nullable2.HasValue
    ? new int?(nullable2.GetValueOrDefault() - --num)
    : null;
Console.WriteLine("With Nullable<int> n = {0}", nullable);

Daha fazla veya daha az aynı, 15 ** atama peşindeler. İki kez --num 2 - -1, 3 sonuçlanan çalışmasına neden çalışıyor.

Ayrıca i = ~i ama yöntem çağrısı ifadelerle değil gibi ifadeler ile aynı işi yapar...

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Mark Hyder

    Mark Hyder

    6 EKİM 2011
  • mist64

    mist64

    30 Mayıs 2006
  • taliajoy18

    taliajoy18

    12 Temmuz 2011