隐含的营运者在一般类型
-
26-09-2019 - |
题
是有什么错使用一个隐含的操作人员如下:
//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;
}
}
我想我可以治疗为对象的实例如一个值类型的这种方式,但是看到我从没见过这样的一个例子,我想也许是有原因的 不 做这样的事情,一个人可以指出?
在我的实际代码我正想这样做的部分数据的抽象层,这样我就可以回对象的信息,描述了基本数据,但是允许的逻辑代码,把它作为一个值的类型时,它所需要了解的价值,同时保持它所有漂亮和类型的安全与仿制药。
解决方案
如果所有的以下情况:
所有 可能值的你
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
来自!
其他提示
这是一个很大的图案。请记住,为了使用它作为类型T
的变量,你必须明确地将其转换为T
,或将其分配给类型T
的变量。铸造将在方法调用和其它东西(如你的另外实例)采取T
自动进行。