gpt4 book ai didi

c# - 空条件运算符不适用于泛型方法中的 Func

转载 作者:太空狗 更新时间:2023-10-29 22:15:38 25 4
gpt4 key购买 nike

这是编译器错误还是空条件运算符不能与 Func 一起工作的特定选择原因?泛型方法内部?

举个例子,下面的代码不编译

public static T Test<T>(Func<T> func)
{
return func?.Invoke() ?? default(T);
}

编译器产生的错误是CS0023 Operator '?' cannot be applied to operand of type 'T'

不过,我知道您可以这样做:

public static T Test<T>(Func<T> func)
{
return func != null ? func() : default(T);
}

为什么不允许呢?

进一步阐述Action<T>但是按预期工作。

public static void Test<T>(Action<T> action, T arg)
{
action?.Invoke(arg);
}

更新(2017-01-17):

经过更多的研究,它变得更没有意义,即使有以下内容:

假设我们有一个类(引用类型)

public class Foo
{
public int Bar { get; set; }
}

假设我们有一个 Func<int>

Func<int> fun = () => 10;

以下作品:

// This work
var nullableBar = foo?.Bar; // type of nullableBar is int?
var bar = nullableBar ?? default(int); // type of bar is int

// And this work
nullableBar = fun?.Invoke(); // ditto
bar = nullableBar ?? default(int); // ditto

根据那里应用的逻辑,这意味着 Func<T>使用 null-conditional 的值类型和 null-coalescing运营商应该工作。

但是一旦 null-conditional 的左侧泛型类型是通用的,没有约束,那么它不能应用它应该能够考虑的相同逻辑它可以在显式应用类型时将相同的逻辑应用于值类型 引用类型。

我知道编译器的限制,我只是不明白为什么它不允许它以及为什么它希望输出不同,无论是引用类型还是值类型,考虑到手动应用类型都会产生预期的结果。

最佳答案

不幸的是,我认为您遇到了编译器的边缘情况。 ?.运营商需要返回 default(RetrunTypeOfRHS)用于类(class)和 default(Nullable<RetrunTypeOfRHS>)对于结构。因为你没有约束T是类还是结构,它无法判断要提升到哪个。

原因Action<T>有效是因为右侧的返回类型是 void对于这两种情况,它不需要决定进行哪种促销。

您将需要使用您展示的长格式或有两种对 T 具有不同约束的方法

    public static T TestStruct<T>(Func<T> func) where T : struct
{
return func?.Invoke() ?? default(T);
}

public static T TestClass<T>(Func<T> func) where T : class
{
return func?.Invoke(); // ?? default(T); -- This part is unnecessary, ?. already
// returns default(T) for classes.
}

关于c# - 空条件运算符不适用于泛型方法中的 Func<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41637051/

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