Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制转换到OrganizationServiceContext时出现InvalidCastException_C#_Generics_Casting_Microsoft Dynamics - Fatal编程技术网

C# 强制转换到OrganizationServiceContext时出现InvalidCastException

C# 强制转换到OrganizationServiceContext时出现InvalidCastException,c#,generics,casting,microsoft-dynamics,C#,Generics,Casting,Microsoft Dynamics,我有一个由CrmSvcUtil生成的早期绑定类: public partial class CustomerCrmServiceContext : Microsoft.Xrm.Sdk.Client.OrganizationServiceContext { ... ... } 然后我有一个这样的类(简短版本): 我是这样使用这个类的: public abstract class PluginClassBase: IDisposable { ... ... prot

我有一个由CrmSvcUtil生成的早期绑定类:

public partial class CustomerCrmServiceContext : Microsoft.Xrm.Sdk.Client.OrganizationServiceContext
{
  ...
  ...
}
然后我有一个这样的类(简短版本):

我是这样使用这个类的:

public abstract class PluginClassBase: IDisposable
{
    ...
    ...
    protected readonly OrganizationServiceContext ServiceContext;
    ...
    ...
}
public class DoWomethingWorkerPlugin : PluginClass<account, CustomerCrmServiceContext>
{
  ...
}
这引发了一个InvalidCastException,说:

“无法强制转换类型为的对象 输入“Microsoft.Xrm.Sdk.Client.OrganizationServiceContext” “Customer.DataModel.CustomerCrmServiceContext”

我很困惑,因为生成的类“CustomerCrmServiceContext”具有基类型“OrganizationServiceContext”,因此强制转换应该可以工作


当基类型相同时,有人知道什么会导致InvalidCastException吗?

尽管
CustomerCrmServiceContext
OrganizationServiceContext
,但事实并非如此,这就是为什么会出现异常

强制转换无法在运行时神奇地更改对象的类型

通过使用cast,您基本上告诉编译器“尽管您认为这个对象是
SomeBaseType
,但我知道,在运行时,它将始终是
SomeDerivedType
的一个实例,因此请将其视为一个实例”


如果在运行时发现该对象不是您试图强制转换的类型,您将得到一个
InvalidCastException
,并且
OrganizationServiceContext
不是
CustomerCrmServiceContext

,尽管
CustomerCrmServiceContext
OrganizationServiceContext
,相反的情况并非如此,这就是为什么会出现异常

强制转换无法在运行时神奇地更改对象的类型

通过使用cast,您基本上告诉编译器“尽管您认为这个对象是
SomeBaseType
,但我知道,在运行时,它将始终是
SomeDerivedType
的一个实例,因此请将其视为一个实例”


如果在运行时发现该对象不是您试图强制转换到的类型,您将得到一个
InvalidCastException
,而
OrganizationServiceContext
不是
CustomerCrmServiceContext

@PaulRichardson
CustomerCrmServiceContext
是一个更具体的类型。它将对
OrganizationServiceContext
具有附加行为,并且编译器无法知道如何将
OrganizationServiceContext
的实例转换为
CustomerCrmServiceContext
的实例,除非您定义了自定义转换运算符。当您使用
CustomerCrmServiceContext
的实例代替
OrganizationServiceContext
(可替换性)时,运行时类型不会更改,但是编译器知道它实现了
OrganizationServiceContext
@PaulRichardson
CustomerCrmServiceContext
的所有行为,这是一种更具体的类型。它将对
OrganizationServiceContext
具有附加行为,并且编译器无法知道如何将
OrganizationServiceContext
的实例转换为
CustomerCrmServiceContext
的实例,除非您定义了自定义转换运算符。当您使用
CustomerCrmServiceContext
的实例代替
OrganizationServiceContext
(可替换性)时,运行时类型不会更改,但编译器知道它实现了
OrganizationServiceContext
的所有行为。
public class DoWomethingWorkerPlugin : PluginClass<account, CustomerCrmServiceContext>
{
  ...
}
ServiceContext = (C)base.ServiceContext;