我有一个继承自MembershipUser的自定义CustomMembershipUser。

public class ConfigMembershipUser : MembershipUser
{
    // custom stuff
}

我正在使用Linq-to-SQL从数据库读取并获得一个User实体;为了使该功能成为MembershipUser,我定义了显式转换:
public static explicit operator MembershipUser(User user)
{
    DateTime now = DateTime.Now;

    if (user == null) return null;

    return new MembershipUser("MagicMembershipProvider",
                              user.DisplayName, user.Id,
                              user.Email, "", "", true, false,
                              now, now, now, now, now);
}

这个 Actor 工作正常:
MembershipUser memUser = (MembershipUser) entityUser;

但是,第二次对CustomMembershipUser的强制转换失败:
MembershipUser memUser = (MembershipUser) entityUser;
CustomMembershipUser custUser = (CustomMembershipUser) memUser;

如果我将类型转换更改为
CustomMembershipUser custUser = memUser;

我收到一个智能提示错误,告诉我隐式强制转换将不起作用,但存在显式强制转换。

...而且最重要的是,我显然无法定义从基类到子类的转换。我尝试过,但失败了。我最不了解的事情是,为什么从基类到子类的转换会失败?根据定义,子类具有基类的所有属性,所以出了什么问题。

编辑

我试图定义一个从MembershipUser到CustomMembershipUser的显式转换(首先我为转换定义了一个私有(private)构造函数):
private ConfigMembershipUser(MembershipUser user)
    : base(user.ProviderName, user.UserName, user.ProviderUserKey, user.Email,
           user.PasswordQuestion, user.Comment, user.IsApproved, user.IsLockedOut,
           user.CreationDate, user.LastLoginDate, user.LastActivityDate,
           user.LastPasswordChangedDate, user.LastLockoutDate)
    {
        // initialize extended CustomMembershipUser stuff here
    }

然后定义我的自定义类型转换:
public static explicit operator CustomMembershipUser(MembershipUser user)
{
     return new CustomMembershipUser(user);
}

我收到以下错误:



所以...我不能从基类转换为子类吗?

最佳答案

相反,从基类的对象到子类的转换将始终失败,因为基类仅具有基类的属性(而不是子类)。

如您所说,由于子类具有基类的所有属性(它是“is-a”基类对象),因此从子类到基类的强制转换将始终成功,但绝不会相反。

换句话说,您可以将所有豹子都视为猫,但是您不能将任意猫当成豹子来对待(除非从一开始就已经是豹子了)。

您需要返回CustomMembershipUser对象而不是MembershipUser对象,或者需要定义另一个显式的强制转换单独函数,该函数通过创建新的CustomMembershipUser对象将MembershipUsers转换为CustomMembershipUsers。您不能无处获取CustomMembershipUser对象;它是直接或通过实例化CustomMembershipUser的子类(而不是基类)首先创建的。

编辑:

在定义对子类的显式转换时,我错了。这是不可能的(如您看到的错误所示)。您现在似乎处在与this question请求者完全相同的情况。强制转换并不是真正的方法-创建CustomMembershipUser对象开始(可以直接用作MembershipUser对象),或者编写一个接受MembershipUser并创建CustomMembershipUser的转换方法。

从基础对象转换为子类对象的唯一有意义的时间是当它已经是子类对象时(但持有该对象的变量是基类类型的)。

关于c# - InvalidCastException : Unable To Cast Objects of type [base] to type [subclass],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5240143/

10-09 03:30