Abstract class as ref compiler error

时间:2015-02-17 03:27:19

标签: c# abstract-class ref

所以我在我的应用程序中创建了一个设置框架,一直都很好,直到遇到这个小路障。

在抽象基类中,我有这个:

public abstract class SettingsBase
{
    public event SettingsChangedEventHandler SettingsChanged;

    public void NotifyChange() { NotifyChange(this); }

    private void NotifyChange(object sender, EventArgs args = null) 
    { 
        SettingsChanged?.Invoke(this); 
    }

    protected void OnSetChildSettings(ref SettingsBase settings, SettingsBase value)
    {
        if (Equals(settings, value)) return;
        if (settings != null) settings.SettingsChanged -= NotifyChange;
        settings = value;
        if (settings != null) settings.SettingsChanged += NotifyChange;
    }
}

这是一个减少版本,只显示导致我悲痛的代码。

这在一个实现中:

public class ChildSettings : SettingsBase { }

以下是编译器错误显示的位置:

public class ParentSettings : SettingsBase
{
    private ChildSettings _childSettings;

    public ChildSettings ChildSettings
    {
        get { return _childSettings; }
        set { OnSetChildSettings(ref _childSettings, value); }
    }
}

这让我很生气,说:“'ref'参数类型与参数类型不匹配”。它绝对是一个SettingsBase,我有做演员吗?我是否必须使用约束来制作模板?如果是这样的话,这是非常差的C#,虽然也许我在使用它几年后就被宠坏了。

编辑 - 这有效:

protected void OnSetChildSettings<T>(ref T settings, T value) where T : SettingsBase
{
    if (Equals(settings, value)) return;
    if (settings != null) settings.SettingsChanged -= NotifyChange;
    settings = value;
    if (settings != null) settings.SettingsChanged += NotifyChange;
}

虽然我有一个有效的解决方案,但我仍然想了解错误和原因,所以答案仍然非常受欢迎。

Edit2 - 修正了命名,我只是把它改成了这个问题的东西而错过了一些。谢谢:))

0 个答案:

没有答案