C# 显式强制转换运算符、泛型、继承和接口

C# 显式强制转换运算符、泛型、继承和接口,c#,.net-3.5,C#,.net 3.5,这似乎不起作用。可能吗 public interface IInterface1 {} public interface IInterface2 { } public interface IMyT1 : IInterface1 {} public interface IMyT2 : IInterface2 {} public abstract class BaseClass<T1, T2> : Interface2 where T1 : IInterface1, where T2

这似乎不起作用。可能吗

public interface IInterface1 {}
public interface IInterface2 { }

public interface IMyT1 : IInterface1 {}
public interface IMyT2 : IInterface2 {}

public abstract class BaseClass<T1, T2> : Interface2 where T1 : IInterface1, where T2 : IInterface2
{
     protected T1 T1Obj {get;set;}

     public static explicit operator T1(BaseClass<T1,T2> val)
     {
          return val.T1Obj;
     }
}

public class SomeClass : BaseClass<IMyT1, IMyT2>, ISomeClass {}

这可能很疯狂,但有可能吗?

您要寻找的是通用变异。至少,我假设是这样的——您的示例代码缺少我们检查它是否实际工作所需的位

public interface IInterface1 {}
public interface IInterface2 { }

public interface IMyT1 : IInterface1 {}
public interface IMyT2 : IInterface2 {}

public abstract class BaseClass<T1, T2> : Interface2 where T1 : IInterface1, where T2 : IInterface2
{
     protected T1 T1Obj {get;set;}

     public static explicit operator T1(BaseClass<T1,T2> val)
     {
          return val.T1Obj;
     }
}

public class SomeClass : BaseClass<IMyT1, IMyT2>, ISomeClass {}
在C#3和更早的版本中根本不能使用它。在C#4中,您可以将其用于接口和委托,但只有在类型参数上使用
In
out
明确标记的情况下,编译器才能确保其基本安全


如果你在这个网站上搜索通用方差或协方差与逆变,你会发现大量的信息。或者你可以看看它。我在的第13章中给出了它的详细信息,如果您在上搜索“协方差”,您可以流式传输或下载我就这个主题所作的一个小时的演讲。

您要查找的是通用方差。至少,我假设是这样的——您的示例代码缺少我们检查它是否实际工作所需的位

在C#3和更早的版本中根本不能使用它。在C#4中,您可以将其用于接口和委托,但只有在类型参数上使用
In
out
明确标记的情况下,编译器才能确保其基本安全


如果你在这个网站上搜索通用方差或协方差与逆变,你会发现大量的信息。或者你可以看看它。我在的第13章中给出了它的详细信息,如果您在上搜索“协方差”,您可以流式传输或下载我就这个主题所作的长达一小时的演讲。

您的对象不是
IMyT1
类型,这就是转换失败的原因

这些是您的有效转换

var instance = new SomeClass();
var localInterface = (ISomeClass)instance;
var baseClass = (BaseClass<IMyT1, IMyT2>)instance;
var baseInterface = (IInterface2)instance;
var instance=newsomeclass();
var localInterface=(ISomeClass)实例;
var baseClass=(baseClass)实例;
var baseInterface=(IIinterface2)实例;
。。。
实例
的类型不是
IMyT1
IMyT2
IInterface1
。试图投靠其中任何一个都会失败。如果
BaseClass
SomeClass
继承自
IMyT1
,则您将能够完成此转换


在编译时解析静态方法,而在运行时考虑强制转换。这与您不能使用
虚拟静态方法的原因相同。

您的对象不是
IMyT1
类型,这就是转换失败的原因

这些是您的有效转换

var instance = new SomeClass();
var localInterface = (ISomeClass)instance;
var baseClass = (BaseClass<IMyT1, IMyT2>)instance;
var baseInterface = (IInterface2)instance;
var instance=newsomeclass();
var localInterface=(ISomeClass)实例;
var baseClass=(baseClass)实例;
var baseInterface=(IIinterface2)实例;
。。。
实例
的类型不是
IMyT1
IMyT2
IInterface1
。试图投靠其中任何一个都会失败。如果
BaseClass
SomeClass
继承自
IMyT1
,则您将能够完成此转换


在编译时解析静态方法,而在运行时考虑强制转换。这也是您不能使用
虚拟静态方法的原因之一。

IMyT1的定义是什么?那么IMyT2呢?IMyT1的定义是什么?还有IMyT2?该死。我想你已经回答了我过去提出的一个通用的方差问题。直到你提起这件事,我才把它当成问题。我明白为什么这行不通了。谢谢乔恩,我有你的书《深入》(在MEAP,我还在等装订版),我非常感谢你的书。它正在扩大我的C#教育,这是前所未有的。@Cyberherbalist:我很高兴听到它:)(我也期待着第二版的硬拷贝出版!)当。我想你已经回答了我过去提出的一个通用的方差问题。直到你提起这件事,我才把它当成问题。我明白为什么这行不通了。谢谢乔恩,我有你的书《深入》(在MEAP,我还在等装订版),我非常感谢你的书。它正在扩大我在C#的教育,这是前所未有的。@Cyberherbalist:我很高兴听到它:)(我也期待着第二版的硬拷贝出版!)