gpt4 book ai didi

c# - 泛型类型的隐式运算符

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

像下面这样使用隐式运算符有什么问题吗:

//linqpad c# program example
void Main()
{
var testObject = new MyClass<int>() { Value = 1 };

var add = 10 + testObject; //implicit conversion to int here
add.Dump(); // 11
}

class MyClass<T>
{
public T Value { get; set; }
public static implicit operator T (MyClass<T> myClassToConvert)
{
return myClassToConvert.Value;
}
}

我想我可以通过这种方式将对象的实例视为值类型,但看到我从未见过这样的例子,我想也许有理由这样做有人可以指出这样的事情吗?

在我的实际代码中,我考虑将此作为数据抽象层的一部分,以便我可以返回包含描述底层数据的信息的对象,但允许逻辑代码在需要时将其视为值类型了解是值(value),同时使用泛型保持一切良好和类型安全。

最佳答案

如果以下所有条件都为真:

  • 所有 MyClass<T> 的可能值类型(包括 null 如果它不是值类型!)映射到有效值 T

  • 隐式运算符从不抛出异常(即使是 null 也不抛出!)

  • 隐式转换具有语义意义并且不会混淆客户端程序员

那么这个就没有问题了。当然,您可以做这三件事中的任何一件,但这将是糟糕的设计。特别是,抛出的隐式运算符可能很难调试,因为调用它的地方并没有说明它正在被调用。

例如,考虑 T?没有隐式转换为 T (其中 T 当然是值类型)。如果有这样一个隐式运算符,它必须在 T? 时抛出。为空,因为没有明显的值可以转换 null这对于任何值类型都是有意义的 T .


让我举一个例子,我在调试隐式运算符抛出的问题时遇到了麻烦:

public string Foo()
{
return some_condition ? GetSomething() : null;
}

在这里,GetSomething返回了一些我写的类型,它有一个用户定义的隐式转换为 string .我绝对确定 GetSomething永远无法返回 null , 但我得到了 NullReferenceException !为什么?因为上面的代码等同于

return some_condition ? (string)GetSomething() : (string)null;

但是为了

return (string)(some_condition ? GetSomething() : (Something)null);

现在您可以看到 null 在哪里来自!

关于c# - 泛型类型的隐式运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3823145/

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