强制精确参数匹配

时间:2018-09-07 08:13:04

标签: c# function

具有类Base和类Derived : Base,以及如何实现功能

void Foo(Base obj) { } // Must be restricted to Base type

此代码的编译位置

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

但是此代码不是吗?

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

2 个答案:

答案 0 :(得分:0)

我认为您无法在C#中做到这一点。

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

 public static void Main(string[] args)
    {
        var derived = new Derived();
        var b = new Base();
        D(derived); //Derived
        D(b); //Base
    }

    public static void D(Base base)
    {
        Console.WriteLine(base.GetType());

    }

答案 1 :(得分:0)

您不能将方法限制为仅在编译时接受特定类型的参数,除非该类型为sealed。实际上,这将打破任何面向对象的原则,因为派生类型的实例始终是基类的实例。另一方面,您的Foo方法根本不需要关心它,因为它不知道任何派生类型。它得到的只是一个Base类型的参数,该参数可以或不能是派生类型。

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

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

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