所以我在我的应用程序中创建了一个设置框架,一直都很好,直到遇到这个小路障。
在抽象基类中,我有这个:
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 - 修正了命名,我只是把它改成了这个问题的东西而错过了一些。谢谢:))