c# - 这是重载解析中的预期行为吗?

标签 c# .net overload-resolution

让我们使用以下简化代码:

更新:这些方法实际上返回一个泛型类型 <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/

相关文章:

c# - 分号在 C# 中的条件 block 之后做什么?

.net - 为什么有针对 .Net 的调试和发布版本,但没有针对 Java 的版本?

c# - 方法重载决议系统如何决定在传递空值时调用哪个方法?

c++ - 重载转换函数模板

c# - 将我有代码的所有项目都添加到解决方案中是否更好?或者只添加 dll 引用?

c# - 从我的服务器下载 zip 文件时遇到问题

c# - 如何同时运行两个或多个sql查询?

c# - 正则表达式从 HTML 中删除所有跨度,保持内部文本不变

.net - 有关重构现有 .net 应用程序以支持本地化的技巧?

c# - 为什么类型约束不是方法签名的一部分?