"约束类型"在VB/C#中是否有用?

Ror*_*ker 8 c# vb.net types constraints

介绍

Marc Gravell建议我向本网站发布新的语言功能建议以收集关于它们的一般意见.

我们的想法是收集它们是否有用,或者可能已经有另一种方式来实现我所追求的目标.

建议(约束类型)

因此编写VB.Net中的正常变量声明:

Dim SomeVariable as SomeType
Run Code Online (Sandbox Code Playgroud)

我建议允许以下表格

Dim SomeVariable1 as {SomeType, ISomeInterface}
Dim SomeVariable2 as {SomeType, ISomeInterface, ISomeOtherInterface}
Run Code Online (Sandbox Code Playgroud)

这种语法借鉴了Vb.Net的约束泛型的风格

为什么允许这样做?...有什么好处?

我最初想到的具体情况是定义一个特定的控件子集.我希望为一系列Control工厂创建一个接口,它将根据一些业务规则提供控制.

这些控件的使用者需要通过接口创建所有控件,还应该实现一系列接口(在我的情况下只有一个),这些接口为所有这些控件提供了普通控件中通常不具备的附加功能.

值得注意的是,以下目前不起作用.

Public Interface ISpecialControl
End Interface

Public Interface IControlProvider
    Function CreateControl(Of T As {Control, ISpecialControl})() As T
End Interface

Public Class SpecialTextBoxProvider
    Implements IControlProvider
    Public Function CreateControl(Of T As {Control, ISpecialControl})() As T Implements IControlProvider.CreateControl
        Return New SpecialTextBox
    End Function
End Class

Public Class SpecialTextBox
    Inherits TextBox
    Implements ISpecialControl
    Public Sub New()

    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

我认为这转化为C#:

public interface ISpecialControl
{
}

public interface IControlProvider
{
    T CreateControl<T>()
        where T : Control, ISpecialControl;
}

public class SpecialTextBoxProvider : IControlProvider
{
    public T CreateControl<T>()
        where T : Control, ISpecialControl
    {
        return new SpecialTextBox();
    }
}

public class SpecialTextBox : TextBox, ISpecialControl
{
}
Run Code Online (Sandbox Code Playgroud)

由于无法将SpecialTextbox强制转换为T,因此返回"New SpecialTextbox"的尝试失败.

"Value of type 'MyApp.SpecialTextBox' cannot be converted to 'T'"
Run Code Online (Sandbox Code Playgroud)

我意识到我的工厂可以被允许返回简单的控件,我可以在运行时检查它们是否实现了ISpecialControl,但是这会产生运行时问题,我宁愿在编译时检查它,因为它是合乎逻辑的可能性,即使当前不是实际的

更新:这个想法是这些工厂可能位于外部(甚至可能是第三方)程序集中,并且可以依赖于他们想要的任何控件库,创建并返回这些控件的衍生产品,这些控件也实现了ISpecialControl.

这些程序集可以通过自我配置 - 反射(第一次通过反射,然后进行配置,然后在进一步的运行中使用)来定位,并且在调用程序集不知道这些控件将具有什么依赖性的情况下使用.

它确实要求这些工厂是可构造的,而不传递有关他们预期要控制的控制的信息,因为那样会破坏这一点.

那你觉得怎么样......这会有用吗?......有没有更好的方法来实现这一目标?有没有办法实现这一目标?

Mar*_*ell 0

它更多的是“约束变量”而不是“约束类型”——但绝对有趣。与通用约束一样,如果存在冲突的成员,解决方案可能会出现一些小问题,但与通用约束一样,可能会应用相同的解决方法。

当然,务实的观点是您已经可以进行强制转换等,但是您需要使两个引用彼此保持最新......

嗯...有趣。