作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
像下面这样使用隐式运算符有什么问题吗:
//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/
我是一名优秀的程序员,十分优秀!