2012-03-21 23 views
5

Ben üçlü ifade oluşturmak çalışılıyor ve aşağıdaki hatayı alıyorumÜçlü Anlatım

"LiveSubscription ve DisconnectedSubscription arasında hiçbir örtük dönüştürme olduğundan koşullu ifadenin türü tespit edilemeyen" deyimi ise

aynı mantık bir çalışır, ama bir üçlü ifadede neden çalışmaz anlamak istedim - İşte

yapmak ne çalışıyorum özü şudur:

public interface IClientSubscription 
{ 
    bool TryDisconnect(); 
} 

public class LiveSubscription : IClientSubscription 
{ 
    public bool TryDisconnect() 
    { 
     return true; 
    } 
} 

public class DisconnectedSubscription : IClientSubscription 
{ 
    public bool TryDisconnect() 
    { 
     return true; 
    } 
} 

public class ConnectionManager 
{ 
    public readonly IClientSubscription Subscription; 

    public ConnectionManager(bool IsLive) 
    { 
     // This throws the exception 
     Subscription = (IsLive) 
      ? new LiveSubscription() 
      : new DisconnectedSubscription(); 

     // This works 
     if (IsLive) 
     { 
      Subscription = new LiveSubscription(); 
     } 
     else 
     { 
      Subscription = new DisconnectedSubscription(); 
     } 
    } 
} 

Her zaman bir if/else'e geçebilirdim ama önce neyin yanlış gittiğini anlamak istedim!

cevap

8

Sen IClientSubscription için işlenen en az birini döküm gerekir:

Subscription = (IsLive) 
      ? (IClientSubscription)new LiveSubscription() 
      : new DisconnectedSubscription(); 

nedeni üçlü ifadesi işlenen tarafından belirlenir belirli türde olmasıdır. Temel olarak, ikinci işleneni ilk ya da tam tersi türüne çevirmeye çalışır. Her ikisi de burada başarısız, çünkü LiveSubscription bir DisconnectedSubscription değil ve tam tersi.
Derleyici, her ikisi de ortak bir taban türünü paylaşıp paylaşmadığını kontrol etmez. yorumunda sorunuzu yanıtlamaya çalışmak


:

Hayır, üçlü ifadeler nesnenin bir çeşit değil, bir üçlü ifade bir atamanın sağ parçasıdır. Bir ödevin her bir sağ taraftaki ifadesi belli bir türe sahipse, aksi halde bu ifadeyi sol taraftaki değişkene atamak imkansız olurdu.
Örnekler:

  • var x = Guid.NewGuid()

    sağ taraftaki ekspresyonu (Guid.NewGuid()) tip Guid arasında, çünkü, bir Guid döner NewGuid() yöntemi.

  • var x = y.SomeMethod()

    sağ taraftaki ifade

  • SomeMethod() dönüş türü tipindedir.

  • var x = IsLive ? "a" : 1

    Bu, besbelli geçersiz değil mi? x ne tür olmalıdır? Bir string veya int?
    Bu, kodunuzla aynı hata iletisine neden olur.

  • Sizin örnek

    biraz değiştirdi:

    var subscription = (IsLive) ? new LiveSubscription() 
              : new DisconnectedSubscription(); 
    

    Not varsubscription önce, şimdi yeni bir değişken başlatmak, varolan değil. Bence burada bile sorunun ne olduğu belli: subscription ne tür olmalı? LiveSubscription veya DisconnectedSubscription?Ne de olabilir, çünkü IsLive'a bağlı olarak, biri ya da diğeri olması gerekir. if ile karşılaştırıldığında Hakkında

:

Kodunuzda yeni LiveSubscription örneği veya IClientSubscription bir örtülü cast oluştuğu Subscription yeni DisconnectedSubscription örneğini atamak, derleyici Subscription ait olduğunu bildiği için IClientSubscription ve her ikisi de LiveSubscription ve DisconnectedSubscription, bu arabirime dolaylı olarak dönüştürülebilir.
Üçlü ifadesiyle atama biraz farklıdır, çünkü derleyici üçlü ifadeyi ilk olarak değerlendirir ve ancak daha sonra Subscription'a atamaya çalışır. Bu, derleyicinin üçlü ifadenin sonucunun IClientSubscription türünde olması gerektiğini bilmediği anlamına gelir.

+0

'Üçlü anlatım belirli bir türden' ile ne demek istiyorsun? Üçlü bir ifadeyi kullanmak için/else ifadesiyle eşdeğeri ne gibi anlamları vardır? Üçlü bir ifadenin basit sözdizimsel şeker olduğu izleniminin altındaydım - ama bazen daha mı? – William

+0

@William: Lütfen tam cevabı, özellikle de alıntı yaptığınız cümlenin ardından paragrafı okuyun. Oldukça açık bir görüşe sahibim. –

+0

Tam cevabı okudum ama ifadeleri kullanıp kullanmamaya benzemeyen anlamları anlamıyorum. Yani, NEDEN, belirli bir türden üçlü ifadelerdir? Onlar bir çeşit nesne midir? – William