Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#泛型、抽象类和有界通配符_C#_Generics - Fatal编程技术网

C#泛型、抽象类和有界通配符

C#泛型、抽象类和有界通配符,c#,generics,C#,Generics,在C#中使用泛型时,我有一个小问题: 我有以下课程: public abstract class OphControl<TDataModel> : Control where TDataModel : OphDataModel, new() { /// <summary> /// The data model for this control. /// </summary> public TDataModel Data

在C#中使用泛型时,我有一个小问题:

我有以下课程:

public abstract class OphControl<TDataModel> : Control 
    where TDataModel : OphDataModel, new()
{
    /// <summary>
    /// The data model for this control.
    /// </summary>
    public TDataModel DataModel { get; private set; }

    public IEnumerable<OphControl<OphDataModel>> OphControls {
        get {
            return Controls.Cast<Control>().Where(control => control is OphControl<OphDataModel>).Cast<OphControl<OphDataModel>>();
        }
    }

    protected OphControl() {
        DataModel = new TDataModel();
    }
}
公共抽象类控件:控件
其中TDataModel:OphDataModel,new()
{
/// 
///此控件的数据模型。
/// 
公共TDataModel数据模型{get;private set;}
公共IEnumerable控件{
得到{
返回Controls.Cast()。其中(control=>control是OphControl.Cast();
}
}
受保护的控制(){
DataModel=新的TDataModel();
}
}
我的问题是,
OphControls
属性不会编译,因为
OphDataModel
是抽象的,因此我假设在编译时无法确定OphDataModel是否具有零参数公共构造函数(请注意
TDataModel
上的
new()
约束)


我甚至不确定这样做是否正确。我真正想要的是类似于
OphControl的东西,您只需要更改
OphControls
上的通用参数:

public IEnumerable<OphControl<TDataModel>> OphControls {
    get {
        return Controls.Cast<Control>().Where(control => control is OphControl<TDataModel>).Cast<OphControl<TDataModel>>();
    }
}
公共IEnumerable控件{
得到{
返回Controls.Cast()。其中(control=>control是OphControl.Cast();
}
}

这应该是可以编译的,但是如果不了解更多关于类的信息,很难说这是否正确。首先,
OphControl
不是从
OphControl
派生出来的,您对
out
关键字(协方差/逆变)的理解是正确的,它们只能用于委托和接口。因为它不是基类,所以您可能无法强制转换它


与java不同,c#不支持通用通配符(
…您得到的确切错误是什么?非常确定它与
新建
控件的声明在哪里无关?@JaredPar'WinformToolkit.DataModels.OphDataModel'必须是带有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法“WinformToolk”中的参数“TDataModel”it.OphControl'@ivowiblo这是
Control
的标准属性。您得到的编译错误是什么?它看起来应该可以正常工作;感谢您的回答-但我认为这不对…OphControls将返回从OphControl子类化的所有子控件的枚举-它们不会共享相同的数据模型类型。
public abstract class OphControl : Control { ... }

public abstract class OphControl<TDataModel> : OphControl 
    where TDataModel : OphDataModel, new() { ... }
public IEnumerable<OphControl> OphControls {
    get {
        return Controls.OfType<OphControl>();
    }
}