C#一般性古怪
考虑以下几点C#一般性古怪,c#,C#,考虑以下几点 public class MyBuilder {} public interface IBuilder { MyBuilder Builder { get; } } public class TestGeneric<B, S> where B : IBuilder, new()where S : MyBuilder { public TestGeneric() { B b = new B(); S s = b.
public class MyBuilder {}
public interface IBuilder
{
MyBuilder Builder { get; }
}
public class TestGeneric<B, S> where B : IBuilder, new()where S : MyBuilder
{
public TestGeneric()
{
B b = new B();
S s = b.Builder ;// as S;
}
}
公共类MyBuilder{}
公共接口IBuilder
{
MyBuilder生成器{get;}
}
公共类TestGeneric,其中B:IBuilder,new(),其中S:MyBuilder
{
公共TestGeneric()
{
B=新的B();
S=b.Builder;//作为S;
}
}
编译器抱怨:
无法将类型“MyBuilder”隐式转换为“S”。明确的
转换存在
为什么不呢?
毕竟我已经清楚地说明了S:MyBuilder,它是一个类
我认为这也不适用。
问题和此类似,但我看不到答案。
我正在使用VS2013和.NET4.5。当然演员阵容也很好
编辑:我以前有一个密封的类。您应该会得到一个错误提示,如下所示 CS0701:“System.Text.StringBuilder”不是有效的约束。用作约束的类型必须是接口、非密封类或类型参数
您应该在以下错误中获得一个 CS0701:“System.Text.StringBuilder”不是有效的约束。用作约束的类型必须是接口、非密封类或类型参数 毕竟我已经清楚地说明了
S:MyBuilder
,它是一个基类
是的,但是您正在尝试将MyBuilder
向上转换为S
,除非S
为MyBuilder
,否则该操作将不起作用:
TestGeneric<IBuilderImpl,MyNewBuilder> g;
testg;
将尝试将MyBuilder
强制转换为MyNewBuilder
,这将在运行时失败
毕竟我已经清楚地说明了S:MyBuilder
,它是一个基类
是的,但是您正在尝试将MyBuilder
向上转换为S
,除非S
为MyBuilder
,否则该操作将不起作用:
TestGeneric<IBuilderImpl,MyNewBuilder> g;
testg;
将尝试将
MyBuilder
转换为MyNewBuilder
,但在运行时会失败。我没有完全信服,所以我继续挖掘和骚扰同事!
答案如下:
对于引用类型,如果需要从基类型转换为派生类型,则需要显式强制转换
正如我的同事亚历克斯所指出的那样,这里的情况正是如此:
S继承自MyBuilder,与“S.GetType()==typeof(MyBuilder)”不同。
这也证实了我的断言我没有完全信服,所以我继续挖苦和骚扰同事!
答案如下:
对于引用类型,如果需要从基类型转换为派生类型,则需要显式强制转换
正如我的同事亚历克斯所指出的那样,这里的情况正是如此:
S继承自MyBuilder,与“S.GetType()==typeof(MyBuilder)”不同。
这也验证了我的断言我以前有一个密封的类。我猜在修复无效强制转换后会出现错误。我以前有一个密封的类。我猜在修复无效强制转换后会出现错误。但是S:MyBuilder不是一个“is-a”关系吗?编译器不应该在这里尝试向上转换。如果MyNewBuilder:MyBuilder,那么您的示例应该可以正常工作。@narendra但是iBilder.Builder
是MyBuilder
(不一定是S
),所以S=b.Builder
将MyBuilder
向上转换为S
。啊!IBuilder.MyBuilder不是MyBuilder,因此将导致向上投影。谢谢!但是S:MyBuilder不是“是-是”关系吗?编译器不应该在这里尝试向上转换。如果MyNewBuilder:MyBuilder,那么您的示例应该可以正常工作。@narendra但是iBilder.Builder
是MyBuilder
(不一定是S
),所以S=b.Builder
将MyBuilder
向上转换为S
。啊!IBuilder.MyBuilder不是MyBuilder,因此将导致向上投影。谢谢!