让我们看下面的简化代码:

更新:方法实际上返回通用类型为<T>的对象。

void Main()
{
    Foo<object>(null);
}

Bar<T> Foo<T>(T value) // first
{
    Console.WriteLine("Value: {0}", value);
    // return new Bar<T> ...
}

async void Foo<T>(Task<T> task) // second
{
    Console.WriteLine("Value from task: {0}", await task);
    // return new Bar<T> ...
}


这段代码在运行时失败:Object reference not set to an instance of an object.我已经意识到编译器使用Foo参数选择Task<T>的第二个重载。因此,它在尝试等待null时失败。

也许这是根据C#规范的正确行为,但是由于这不是程序员想要的正确重载,因此它可能导致真正的麻烦。如果这不是规范或编译器中的错误,那么在类似情况下编译不应该显示一些警告吗?告诉编译器选择第一个重载的最便捷方法是什么?

最佳答案

重载是根据编译时类型而不是运行时类型选择的,因此这样的工作应该起作用:

void Main()
{
    object value = null;
    Foo<object>(value);
}


如删除的答案中所述,您也可以先将其转换为对象:

Foo<object>((object)null);


要么

Foo<object>(null as object);

10-06 12:17
查看更多