(Cast) değişkeni ve ((cast) değişkeni) arasındaki fark nedir

Takip koduna sahibim:

T imageCollectionItem;

// This checks if image actually exists, if it doesn't it gets the next best one... Thumbnail wil always exist so it will always find one
imageCollectionItem = (this.ResizedImageCollection
    .Where(x => ((IBaseImage)x).Image.ImageSizeType.Key != ImageSizeType.Original)
    .OrderByDescending(x => ((IBaseImage)x).Image.ImageSizeType.Key == imageSizeTypeKey)
    .ThenBy(x => ((IBaseImage)x).Image.ImageSizeType.Order)
    .FirstOrDefault());

if( imageCollectionItem != null )
{
    return ((IBaseImage)imageCollectionItem).Image;//Compiles fine
    return (IBaseImage)imageCollectionItem.Image;//Fails
}

(cast) değişken ve ((cast) değişken) arasındaki fark nedir?

Bir derleme olduğunu düşünüyor, bir tane yapmıyor mu?

1
(cast) değişkeni , cast türündeki özelliğe erişmek için kaydırıldı. Yuvarlak parantez içine alınmazsa, o zaman sadece type değişkeninin özelliklerine erişebilir.
katma yazar Jenish Rabadiya, kaynak

6 cevap

Operatörler için bir öncelik sırası vardır. Oyuncular Unary "blok" ta, üye girişi ise Birincil "blok" ta. Birincil blok, Unary bloğundan daha fazla önceliğe sahiptir. İlk önce Birincil blok operatörü (üye erişimi), ardından cast operatörü (Unary blok) çalıştırılır. Açıkça tür yanlış olduğundan üye erişimi yürütülemiyor. Derleme Hatası.

https://msdn.microsoft.com/ adresine bakın. en-us/library/aa691323 (v = vs.71) .aspx ve (daha yeni) https://msdn.microsoft.com/en-us/library/ms173145.aspx .

3
katma
Ahhhhhhh, Bodmas vs. ... doğru. Bağlantı adam için teşekkürler!
katma yazar Jimmyt1988, kaynak
@ Jimmyt1988 Daha fazla operatörle daha yeni bağlantı :-)
katma yazar xanatos, kaynak
if( imageCollectionItem != null )
{
    return ((IBaseImage)imageCollectionItem).Image;//Compiles fine
    return (IBaseImage)imageCollectionItem.Image;//Fails
}

İlk satır, .Image doğru arabirime yayınlanmış bir nesnede çalıştırıldığı için çalışır.

İkinci satırda, .Image özelliğini çağırdıktan sonra 'e kadar yayın yapmıyorsunuz - ki bu "Üye bulunamadı" hatası veya benzeri sonuçlarla sonuçlandı.

3
katma
Ohhhh görüyorum !!!! Bu o olmalı! Bu tamamen mantıklı
katma yazar Jimmyt1988, kaynak

Bu derleme değil:

(IBaseImage)imageCollectionItem.Image; 

öncelik sırası nedeniyle: //msdn.microsoft.com/en-us/library/0z4503sa.aspx "rel =" nofollow "> cast-operator (Unary) ve nokta operatörü (Birincil). İlki, ikincisinden daha düşük önceliğe sahiptir. Bu nedenle, derleyici önce bu ifadeyi çalıştırmaya çalışır:

imageCollectionItem.Image

Derleme değil çünkü imageCollectionItem bu noktada bir IBaseImage değil.

Parantez içine alarak, derleyiciye, nokta operatörü çalıştırılmadan önce bunu bir blok olarak yürütmesi gerektiğini söylersiniz:

((IBaseImage)imageCollectionItem).Image//an IBaseImage now
1
katma

Bu iki ifadeyi parçalayalım ve tam olarak ne yapmaya çalıştıklarını görelim. Bu şekilde, ikinci ifadenin, dökümden önce özelliğe erişmeye çalıştığını görmek kolay olacaktır.

İlk,

// return ((IBaseImage)imageCollectionItem).Image;//Compiles fine
var casted = (IBaseImage)imageCollectionItem;//cast to IBaseImage
return casted.Image;//access the Image property

İkinci,

//  return (IBaseImage)imageCollectionItem.Image;//Fails
var noCast = imageCollectionItem.Image;//doesn't work becuse Image is not a memebr of imageCollectionItem
return (IBaseImage)noCast;
0
katma
((TypeX)ObjectA).PropertyOfTypeX;//Compiles fine

çünkü ilk önce ObjectA'yı TypeX'e dönüştürdüğünüzden sonra PropertyOfTypeX özelliğine bakın.

(TypeX)ObjectA.PropertyOfTypeX;//won't work

Çünkü ObjectA'yı TypeX'e dönüştürmeden önce PropertyOfTypeX özelliğine erişmeyi deneyin. Bu durumda PropertyOfTypeX'i ObjectA'dan TypeX'e dönüştürmeye çalıştınız. PropertyOfTypeX, bu durumda ObjectA'da mevcut değil.

0
katma
return ((IBaseImage)imageCollectionItem).Image;

Bu return ifadesinde, yalnızca imageCollectionItem, IBaseImage öğesine yayınlanır.

return (IBaseImage)imageCollectionItem.Image;

Tüm iade beyanı yayınlanacak.

0
katma