C# 力精确参数匹配

C# 力精确参数匹配,c#,function,C#,Function,拥有类Base和类派生:Base,如何实现函数 void Foo(Base obj) { } // Must be restricted to Base type 这段代码编译的地方 var obj = new Base(); Foo(obj); 但是这个代码没有 var obj = new Derived(); Foo(obj); 我不认为你能在C#中做到这一点 但是,您可以检查方法中参数的类型,并执行所需的操作。 您不能将方法限制为在编译时只接受特定类型的参数,除非该类型是密封的。事

拥有类
Base
和类
派生:Base
,如何实现函数

void Foo(Base obj) { } // Must be restricted to Base type
这段代码编译的地方

var obj = new Base();
Foo(obj);
但是这个代码没有

var obj = new Derived();
Foo(obj);

我不认为你能在C#中做到这一点

但是,您可以检查方法中参数的类型,并执行所需的操作。


您不能将方法限制为在编译时只接受特定类型的参数,除非该类型是密封的。事实上,这将打破任何面向对象的原则,因为派生类型的实例始终是基类的实例。另一方面,您的
Foo
-方法不应该关心这个问题,因为它不知道任何派生类型。它得到的只是一个
Base
类型的参数,它可以是派生类型,也不能是派生类型

在运行时,您当然可以获取实际类型,并针对
派生的情况抛出异常:

public void Foo(Base @base)
{
    if(@base.GetType() != typeof(Base))
        throw new NotSupportedException("must be of type Base");
}

顺便说一下:
base
是保留关键字,不能用作变量名称。因此,我将逐字(
@
)添加到代码中。

从而打破了面向对象编程的核心概念之一?你为什么要这个?不是吗?(“L”-Liskov替换原则),从面向对象的角度来看,这是毫无意义的。由于每个
派生的
也是一个
,为什么不允许它提供给您的方法?事实上,您的方法甚至不应该关心确切的类型。如前所述,它没有任何意义,但您可以在运行时检查确切的类型
obj.GetType()==typeof(BaseClass)
。看起来您实际上遇到了一些完全不同的问题,解决方案是将成员限制为基类型。你想用这个代码解决什么问题?这背后的目的是什么?对于这两种类型仍然可以编译。顺便说一句:
base
是一个保留关键字,HU不能用作符号。你可以使用
@base
但是。@HimBromBeere我说过我们不能做像OP expect这样的事情。但是在我的回答中提出了另一种方法。
public void Foo(Base @base)
{
    if(@base.GetType() != typeof(Base))
        throw new NotSupportedException("must be of type Base");
}