.net 隐式作用

.net 隐式作用,.net,delegates,casting,.net,Delegates,Casting,我正在使用具有以下(缩写)方法的第三方库类: public void DoSomethingAsync(操作回调) 我没有在我的应用程序代码项目中引用这个第三方库,而是创建了一个抽象第三方依赖项的包装器类。所以,我想做的是有一个包装器方法,如下所示: public void MyDoSomethingAsync(Action<MyResultInfo> callback) { this.wrappedClass.DoSomethingAsync(callback); }

我正在使用具有以下(缩写)方法的第三方库类:

public void DoSomethingAsync(操作回调)
我没有在我的应用程序代码项目中引用这个第三方库,而是创建了一个抽象第三方依赖项的包装器类。所以,我想做的是有一个包装器方法,如下所示:

public void MyDoSomethingAsync(Action<MyResultInfo> callback)
{
    this.wrappedClass.DoSomethingAsync(callback);
}
public void MyDoSomethingAsync(操作回调)
{
this.wrappedClass.DoSomethingAsync(回调);
}

问题是我需要将
回调
参数从
操作
转换为
操作
。使用自定义隐式强制转换运算符可以实现这一点吗?或者有人可以推荐其他方法吗?

不,您不能直接这样做,即使
MyResultInfo
派生自
ResultInfo
;此处不适用,因为
操作
将无法处理从
ResultInfo
派生的任何实例(因此,取消使用
操作
代替
操作的资格)

但是,这并不意味着不能使用适配器,例如:

public void MyDoSomethingAsync(Action<MyResultInfo> callback)
{
    // Create the action which will transform ResultInfo
    // into MyResultInfo and then pass to the wrapped
    // class.
    // Create the action first.
    Action<ResultInfo> a = ri => {
        // Translate ri into MyResultInfo.
        MyResultInfo mri = (translate here);

        // Call the callback with the translated result.
        callback(mri);
    };

    // Pass the action to the wrapped class.
    this.wrappedClass.DoSomethingAsync(a);
}
public void MyDoSomethingAsync(操作回调)
{
//创建将转换ResultInfo的操作
//进入MyResultInfo,然后传递到
//班级。
//首先创建操作。
行动a=ri=>{
//将ri翻译成MyResultInfo。
MyResultInfo mri=(此处翻译);
//使用转换后的结果调用回调。
磁共振成像;
};
//将操作传递给包装类。
这个.wrappedClass.DoSomethingAsync(a);
}

问题在于,您想要制作的内容可能会导致不一致。我假设
MyResultInfo
是从
ResultInfo
派生的,因为否则它就没有任何意义


现在回到不一致性。假设您有委托
操作回调
。调用代码可以这样调用它:
callback(newmyresultinfo())并调用您的
操作
,它将正常工作。但是想象一下它是这样调用的:
callback(newresultinfo())
Action
允许它,但它会产生异常,因为
ResultInfo
不能强制转换为
MyResultInfo

我倾向于不同意第一条语句,因为与委托相反,
操作
可以转换为
操作
第二件事是,您将点链接到非通用代理对冲,这不适用于
操作
,通用代理对冲仅在.net 4.0中引入。现在我完全同意您的答案。但我仍然认为这是问题本身的设计缺陷。有人问如何做错事。
public void MyDoSomethingAsync(Action<MyResultInfo> callback)
{
    // Create the action which will transform ResultInfo
    // into MyResultInfo and then pass to the wrapped
    // class.
    // Create the action first.
    Action<ResultInfo> a = ri => {
        // Translate ri into MyResultInfo.
        MyResultInfo mri = (translate here);

        // Call the callback with the translated result.
        callback(mri);
    };

    // Pass the action to the wrapped class.
    this.wrappedClass.DoSomethingAsync(a);
}