gpt4 book ai didi

c# - 当多个方法重载匹配时,优先级是什么?

转载 作者:行者123 更新时间:2023-11-30 13:55:36 24 4
gpt4 key购买 nike

我正在尝试理解 C# 中的 OOP 概念。

在下面的示例代码中:

  1. 为什么 ins1 更喜欢泛型方法
  2. 为什么 ins2ins3 更喜欢非泛型方法

注意:当我注释掉任何一个“MyTestMethod”方法时,程序仍然继续成功运行。这个片段不是来自生产的东西。这只是我的训练样本。所以,请不要介意命名约定和标准。

using System;

namespace ConsoleApplication1
{
class Program
{
public static void MyTestMethod(J input)
{
Console.WriteLine($"Program.MyTestMethod: {input.Val}");
}
public static void MyTestMethod<T>(T input) where T : J
{
Console.WriteLine($"Program.MyTestMethod<T>: {input.Val}");
}

static void Main(string[] args)
{
J2 ins1 = new J2(1);
MyTestMethod(ins1);

J ins2 = new J(2);
MyTestMethod(ins2);

J ins3 = new J2(3);
MyTestMethod(ins3);

Console.ReadKey();
}
}
internal class J
{
public int Val { get; set; }
public J(int i)
{
Console.WriteLine($"concrete base {i}");
Val = i;
}
}
internal class J2 : J
{
public J2(int i) : base(i * -1)
{
Console.WriteLine($"concrete {i}");
}
}
}

最佳答案

C# 规范的第 7.5.3.2 节是此处的相关部分 - “更好的函数成员”。

结果更简单地展示为:

using System;

class Test
{
static void Foo<T>(T item)
{
Console.WriteLine("Generic");
}

static void Foo(object x)
{
Console.WriteLine("Non-generic");
}

static void Main()
{
Foo(new object()); // Calls Foo(object)
Foo("test"); // Calls Foo<T>(T)
}
}

在这两个调用中,两个重载都是适用 函数成员。在选择调用哪个重载时,编译器首先检查从参数类型(或表达式)到参数类型的哪种转换“更好”。

当参数的类型是 object 时,T 也被推断为 object,因此对于两个候选者,转换是objectobject 的身份转换。此时,7.5.3.2 的打破平局规则介入,第一个是:

If MP is a non-generic method and MQ is a generic method, then MP is better than MQ.

这就是在这种情况下选择非泛型重载的原因。

当参数是string类型时,T被推断为string,所以我们要比较从的转换stringstring(对于泛型方法)到从 stringobject 的转换(对于非泛型方法)。这里出现了 C# 规范的第 7.5.3.3 节,它开始于:

Given an implicit conversion C1 that converts from an expression E to a type T1, and an implicit conversion C2 that converts from an expression E to a type T2, C1 is a better conversion than C2 if at least one of the following holds:

  • E has a type S and an identity conversion exists from S to T1 but not from S to T2

在此上下文中,E 是表达式“test”,S 是string 类型,T1string 类型,T 2object 类型,因此从字符串到字符串的转换被认为更好 - 并且选择了泛型方法。

关于c# - 当多个方法重载匹配时,优先级是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32904150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com