如何指定一个类但不是某个子类的对象?

use*_*282 10 c# oop

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概念可以更好地完成此操作.

Jon*_*eet 8

所以听起来你正试图表达一个约束的反面,例如:

var Foo<T>() where T : SomeClass
Run Code Online (Sandbox Code Playgroud)

这将限制TSomeClass或子类1 ...但你试图明确地不是一个T.

不,我担心C#中没有这样的限制.


1好吧,模拟SomeClass一个开始的类的假设; 它可能是一个界面,具有您可能期望的含义.


Jus*_*tin 7

C#中不存在这样的约束,因为它是一个坏主意,特别是它违反了Liskov替换原则(SOLID原则之一)

可替代性是面向对象编程的一个原则.它指出,在计算机程序中,如果B是子类型A,则类型的对象A可以用类型的对象替换B(即,类型的对象B可以替换类型的对象A),而不改变该程序的任何期望的属性.

如果你的程序显然拒绝了类型的对象,B那么这显然违反了LSP,并且强烈表明你正在做多态错误 - 可能B不应该A首先继承.