让我们使用以下简化代码:
更新:这些方法实际上返回一个泛型类型 <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# 规范,也许这是正确的行为,但它可能会导致真正的麻烦,因为它不是程序员想要的正确重载。如果它不是规范或编译器中的错误,那么编译时不应该在类似情况下显示一些警告吗?告诉编译器选择第一个重载的最方便的方法是什么?
最佳答案
在重载决策中,如果 null
通过,然后选择具有“最”派生类型的方法。在你的情况下,Task
继承自Object
,所以async void Foo<T>(Task<T> task)
被调用。
如果您调用Foo<string>(null);
然后编译器给出了一个错误,因为 Task
不继承自 string
(string
也不是从 Task
继承的)
关于c# - 这是重载解析中的预期行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31453809/