返回子类而不是超类F#

时间:2017-12-29 16:15:04

标签: c# inheritance f#

在C#中我们可以这样做:

public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
    var animalCell = (AnimalCell)collectionView.DequeueReusableCell (animalCellId, indexPath);

    var animal = animals [indexPath.Row];

    animalCell.Image = animal.Image;

    return animalCell;
}

其中AnimalCellUICollectionViewCell的子类。

F#中,我已将AnimalCell定义为:

[<Register ("AnimalCell")>]
type AnimalCell (handle: IntPtr) = 
    inherit UICollectionViewCell (handle)

现在我正在实现相同的功能:

override x.GetCell(collectionView : UICollectionView, indexPath : NSIndexPath) =
    let animalCell = (collectionView.DequeueReusableCell(new NSString("ChatCell"),indexPath)) :?> AnimalCell

    let animal = animals.[indexPath.Row]

    animalCell 

这会产生错误:Error FS0001: This expression was expected to have type 'UICollectionViewCell' but here has type 'AnimalCell' (FS0001)

我可以通过以下方式解决这个问题:

animalCell :> UICollectionViewCell

但为什么这有必要?

1 个答案:

答案 0 :(得分:4)

这是必要的,因为与C#不同,F#不会自动转换(some specific situations除外)。

因此,更少的魔法和更明确的转换。