Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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#一般性古怪_C# - Fatal编程技术网

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,因此将导致向上投影。谢谢!