class A
{
}
class B : A
{
}
void method(A that is not a B argument) {}
void generic_method(generic_class<A that is not a B> generic_argument) {}
void params_method(params A that is not a B[] params_arguments) {}
Run Code Online (Sandbox Code Playgroud)
有没有任何语法方法来做到这一点?我意识到我可以做到
if(argument is B)
throw new ArgumentException("argument cannot be a B", "argument");
Run Code Online (Sandbox Code Playgroud)
在第一个方法的开头,并在foreach中为第二个和第三个方法执行此操作,但我想知道是否有一些关键字或OOP概念可以更好地完成此操作.
所以听起来你正试图表达一个约束的反面,例如:
var Foo<T>() where T : SomeClass
Run Code Online (Sandbox Code Playgroud)
这将限制T为SomeClass或子类1 ...但你试图明确地不是一个T.
不,我担心C#中没有这样的限制.
1好吧,模拟SomeClass一个开始的类的假设; 它可能是一个界面,具有您可能期望的含义.
C#中不存在这样的约束,因为它是一个坏主意,特别是它违反了Liskov替换原则(SOLID原则之一)
可替代性是面向对象编程的一个原则.它指出,在计算机程序中,如果
B是子类型A,则类型的对象A可以用类型的对象替换B(即,类型的对象B可以替换类型的对象A),而不改变该程序的任何期望的属性.
如果你的程序显然拒绝了类型的对象,B那么这显然违反了LSP,并且强烈表明你正在做多态错误 - 可能B不应该A首先继承.