gpt4 book ai didi

c# - 尝试在 C# 中将转换运算符实现为可空类型时出错

转载 作者:行者123 更新时间:2023-11-30 17:28:43 25 4
gpt4 key购买 nike

我目前正在创建一个 struct Nullsafe<T>这将包装一个引用类型(因此 T:class )并以与 Nullable<T> struct 类似的方式运行.重点是模拟接近 Option<T> 的东西。在 F# 中。

我打算在需要特别注意空值的方法中使用该类型。例如,假设我有一个引用类型 class Foo , 以及以下代码:

class Bar
{
public void DoSomethingWithFoo(Nullsafe<Foo> foo);
}

因为我从 T 创建了一个隐式转换运算符至 Nullsafe<T> , 那么下面的代码就可以正常工作了:

Bar bar = new Bar();

Foo nullFoo = null;
bar.DoSomethingWithFoo(nullFoo);

Foo someFoo = new Foo();
bar.DoSomethingWithFoo(someFoo);

Nullsafe<T> type 是一个结构(有意设计,以消除直接传递任何 null 值),因此有人可以编写以下代码段:

Nullable<Nullsafe<Foo>> nullableNullsafeFoo = null;
// and later
bar.DoSomethingWithFoo(nullableNullsafeFoo);

当然,该代码段将不起作用。

所以,我认为在我的 Nullsafe<T> 中创建一个强制转换运算符是一个明智的选择。 struct,它将像上面那样处理可为 null 的表达式:

public static implicit operator Nullsafe<T>(Nullable<Nullsafe<T>> nv) => nv.GetValueOrDefault();

不幸的是,这无法编译。编译器似乎在 Nullsafe<T> 之间没有区别和 Nullable<Nullsafe<T>>类型,并向我抛出消息:

以上是编译器的限制,还是有意为之的行为?如果是这样,是否有任何已知的解决方法?

error CS0555: User-defined operator cannot take an object of the enclosing type and convert to an object of the enclosing type

我正在使用:

  • Visual Studio 社区 2017 v15.8.1
  • .NET Sdk v2.1.400 (如图dotnet --version

该项目是一个多目标库,面向不同的 .NET 框架版本 - 从 net20 到 netstandard2.0

更新

Is the above a limitation of the compiler, or is it a purposedly intended behaviour?

这似乎确实是编译器剥离类型信息的结果,正如其他用户所述Isaac van Bakel .

If so, are there any known workarounds?

按照他的建议,我提交了an issue到 roslyn 平台。

最佳答案

根据 Roslyn 中的代码,尚不清楚这是否确实有意为之。 .该行为来自编译器剥离 Nullable转换中涉及的类型的包装器,以便正确捕获来自 Nullable<Foo> 的身份转换至 Nullable<Foo> - 但在您的情况下,剥离前的类型不同,因此应该允许。

您可以在 the repository 中提出问题- 我找不到任何已经打开的。更熟悉编译器设计的人可以权衡一下,但这看起来确实像是一个错误。

关于c# - 尝试在 C# 中将转换运算符实现为可空类型时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52232475/

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