C# 删除泛型类型约束是否安全? 接口IFoo,其中T:Bar{ Do(T巴); }

C# 删除泛型类型约束是否安全? 接口IFoo,其中T:Bar{ Do(T巴); },c#,generics,backwards-compatibility,C#,Generics,Backwards Compatibility,是否可以通过删除T上的约束来中断任何内容 我认为你不能破坏IFoo的任何实现,因为它们要么用具体的类型MyFoo:IFoo实现它,要么在实现本身是泛型的MyFoo:IFoo其中t:MyBar时声明相同的/更强的约束 我也不认为您可以破坏接口的任何用法,因为这样的方法要么传递一个具体类型foo.Do(new MyBar),要么声明相同/更强的约束UseFoo(…),其中t:MyBar 我是否错过了任何可能出现二进制向后不兼容的情况?MyBar必须从Bar继承。如果Bar定义例如SomeMethod

是否可以通过删除
T
上的约束来中断任何内容

我认为你不能破坏
IFoo
的任何实现,因为它们要么用具体的类型
MyFoo:IFoo
实现它,要么在实现本身是泛型的
MyFoo:IFoo其中t:MyBar
时声明相同的/更强的约束

我也不认为您可以破坏接口的任何用法,因为这样的方法要么传递一个具体类型
foo.Do(new MyBar)
,要么声明相同/更强的约束
UseFoo(…),其中t:MyBar


我是否错过了任何可能出现二进制向后不兼容的情况?

MyBar
必须从
Bar
继承。如果
Bar
定义例如
SomeMethod()
,则将其从定义中删除将停止编译,例如
Bar.SomeMethod()行。因此,是的(事实上,不是,不安全),你不仅允许任何东西被用作
,你还可以破坏现有的代码。添加和删除泛型约束在你从你的泛型类型中使用的API中添加/删除方法时都是一个破坏性的改变。在您的情况下,您不能再调用
Bar
的任何成员,因为
Bar
是完全未知的。@Sinatr with
class Bar{public void SomeMethod(){}
class MyBar:Bar{}
class Foo:IFoo{public void Do(MyBar Bar){Bar.SomeMethod();}
我可以删除类型约束而不会出现编译错误。你能解释一下你的意思吗?@hmnzr我给你一个猜测,为什么我要删除这个约束;)@PatrickHuizinga,你是对的(我错了),因为你将
MyBar
指定为
T
,它继承自
Bar
,所以不需要约束
其中T:Bar
就可以调用
SomeMethod()
。第二条语句仍然适用,您现在可以创建另一个
类:IFoo
,尽管由于这个更改案例,我无法生成一个break。
interface IFoo<in T> where T : Bar {
    Do(T bar);
}