是有什么错使用一个隐含的操作人员如下:

//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自动进行。

隐式转换,而不分配?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top