gpt4 book ai didi

c# - 除非显式设置泛型类型,否则不会调用 Nullable 上的扩展方法

转载 作者:行者123 更新时间:2023-11-30 13:47:05 26 4
gpt4 key购买 nike

在调查另一个问题:“Why there is no Nullable<T>.Equals(T value) method? ”时,我在 Nullable<T> 上做了一个扩展方法暴露了一个通用的 Equals<T>(T)方法:

public static class NullableExtensions
{
public static bool Equals<T>(this T? left, T right) where T : struct, IEquatable<T>
{
if (!left.HasValue)
return false;

return right.Equals(left.Value);
}
}

然而,这样调用它:

double? d = null;
d.Equals(0.0);

调用基地 Equals(object)装箱,正如您在 IL 中看到的那样:

IL_0000: nop
IL_0001: ldloca.s d
IL_0003: initobj valuetype [mscorlib]System.Nullable`1<float64>
IL_0009: ldloca.s d
IL_000b: ldc.r8 0.0
IL_0014: box [mscorlib]System.Double
IL_0019: constrained. valuetype [mscorlib]System.Nullable`1<float64>
IL_001f: callvirt instance bool [mscorlib]System.Object::Equals(object)

如果我将调用更改为显式声明泛型类型:

d.Equals<double>(0.0);

它调用我的扩展方法:

IL_0000: nop
IL_0001: ldloca.s d
IL_0003: initobj valuetype [mscorlib]System.Nullable`1<float64>
IL_0009: ldloc.0
IL_000a: ldc.r8 0.0
IL_0013: call bool ConsoleApplication8.NullableExtensions::Equals<float64>(valuetype [mscorlib]System.Nullable`1<!!0>, !!0)

为什么编译器不选择扩展方法而不是 Equals(object)方法?

是不是因为我刚刚选择了一个糟糕的方法名称 Equals<T>(T)它实际上不是 Equals 的真正覆盖而不是继承查找的一部分?

最佳答案

Why does the compiler not choose the extension method over the Equals(object) method?

如果没有其他选择,考虑扩展方法。这是一个回退——它不是实例方法的正常重载决策的一部分。这并非特定于可空类型 - 它是正常扩展方法调用的一部分。

来自规范的第 7.6.5.2 节:

In a method invocation of one of the forms

[...]

if the normal processing of the invocation finds no applicable methods, an attempt is made to process the construct as an extension method invocation.

(强调我的。)

关于c# - 除非显式设置泛型类型,否则不会调用 Nullable<T> 上的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18736146/

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