Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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# 实现(可能)协变强制转换 我有以下课程: XView:BaseView XDAO:BaseDAO MainViewModel 其中TX:X 何处TView:视图 TDAO:DAO在哪里 XMainViewModel:MainViewModel_C#_.net_Generics_Casting_Covariance - Fatal编程技术网

C# 实现(可能)协变强制转换 我有以下课程: XView:BaseView XDAO:BaseDAO MainViewModel 其中TX:X 何处TView:视图 TDAO:DAO在哪里 XMainViewModel:MainViewModel

C# 实现(可能)协变强制转换 我有以下课程: XView:BaseView XDAO:BaseDAO MainViewModel 其中TX:X 何处TView:视图 TDAO:DAO在哪里 XMainViewModel:MainViewModel,c#,.net,generics,casting,covariance,C#,.net,Generics,Casting,Covariance,我有一个XMainViewModel的实例。我想将其转换为MainViewModel。这可能吗?它可能包含协变项。我不熟悉协方差,不久前才开始使用泛型,所以我在这里很困惑(我也希望我没有在这个问题上犯任何错误)。感谢您的帮助 这可能吗 不支持。仅在使用引用类型构造的接口和委托上支持通用协方差和逆变 我在这里很困惑 这是一个令人困惑的话题。思考这个问题的一个方法是总是问自己“假设这是合法的,会出什么问题?”你说 我有XMainViewModel。我想将其转换为MainViewModel 让我们看一

我有一个
XMainViewModel
的实例。我想将其转换为
MainViewModel
。这可能吗?它可能包含协变项。我不熟悉协方差,不久前才开始使用泛型,所以我在这里很困惑(我也希望我没有在这个问题上犯任何错误)。感谢您的帮助

这可能吗

不支持。仅在使用引用类型构造的接口和委托上支持通用协方差和逆变

我在这里很困惑

这是一个令人困惑的话题。思考这个问题的一个方法是总是问自己“假设这是合法的,会出什么问题?”你说

我有
XMainViewModel
。我想将其转换为
MainViewModel

让我们看一个更简单的例子。您有一个
列表
,您希望将其强制转换为
列表
。什么会出错

List<Giraffe> giraffes = new List<Giraffe>();
giraffes.Add(new Giraffe());
List<Animal> animals = (List<Animal>)giraffes; // This is illegal. What if it were legal?
animals.Add(new Tiger());
Giraffe g = giraffes[1]; // And we just put a Tiger into a variable of type Giraffe.
List giraffes=newlist();
添加(新的Giraffe());
列出动物=(列出)长颈鹿;//这是违法的。如果它是合法的呢?
添加(新老虎());
长颈鹿g=长颈鹿[1];//我们把一只老虎放入长颈鹿类型的变量中。
这就是为什么这是非法的,为什么你的例子也是非法的。但这是合法的:

IEnumerable<Animal> animals = giraffes;
IEnumerable动物=长颈鹿;
为什么这是合法的?因为IEnumerable根本无法插入老虎。该接口已标记为协方差安全,并且C#编译器已验证它是安全的,因此允许进行此转换

我已经写了很多关于协方差和反方差的答案、博客文章和文章,如果你想了解更多关于这个特性的信息以及我们为什么要设计它,那么就做一些搜索吧

您可以通过(1)将
MainViewModel
放入一个接口并将其标记为
IMainViewModel
,然后(2)确保该接口的任何方法都不会将A、B或C作为参数,也不会有A、B或C类型的属性具有setter,等等,使您的示例合法化。也就是说,A、B和C的每次使用都是一个输出位置,而不是一个输入位置。这就是编译器如何知道协方差是安全的

我也希望我没有在这个问题上犯任何错误

这是“协变”,而不是“协变”。“协方差”是一个名词;“协变”是一个形容词

这可能吗

不支持。仅在使用引用类型构造的接口和委托上支持通用协方差和逆变

我在这里很困惑

这是一个令人困惑的话题。思考这个问题的一个方法是总是问自己“假设这是合法的,会出什么问题?”你说

我有
XMainViewModel
。我想将其转换为
MainViewModel

让我们看一个更简单的例子。您有一个
列表
,您希望将其强制转换为
列表
。什么会出错

List<Giraffe> giraffes = new List<Giraffe>();
giraffes.Add(new Giraffe());
List<Animal> animals = (List<Animal>)giraffes; // This is illegal. What if it were legal?
animals.Add(new Tiger());
Giraffe g = giraffes[1]; // And we just put a Tiger into a variable of type Giraffe.
List giraffes=newlist();
添加(新的Giraffe());
列出动物=(列出)长颈鹿;//这是违法的。如果它是合法的呢?
添加(新老虎());
长颈鹿g=长颈鹿[1];//我们把一只老虎放入长颈鹿类型的变量中。
这就是为什么这是非法的,为什么你的例子也是非法的。但这是合法的:

IEnumerable<Animal> animals = giraffes;
IEnumerable动物=长颈鹿;
为什么这是合法的?因为IEnumerable根本无法插入老虎。该接口已标记为协方差安全,并且C#编译器已验证它是安全的,因此允许进行此转换

我已经写了很多关于协方差和反方差的答案、博客文章和文章,如果你想了解更多关于这个特性的信息以及我们为什么要设计它,那么就做一些搜索吧

您可以通过(1)将
MainViewModel
放入一个接口并将其标记为
IMainViewModel
,然后(2)确保该接口的任何方法都不会将A、B或C作为参数,也不会有A、B或C类型的属性具有setter,等等,使您的示例合法化。也就是说,A、B和C的每次使用都是一个输出位置,而不是一个输入位置。这就是编译器如何知道协方差是安全的

我也希望我没有在这个问题上犯任何错误


这是“协变”,而不是“协变”。“协方差”是一个名词;“协变”是一个形容词。

变化只由接口支持,而不是类。变化只由接口支持,而不是类。再一次,通过你的“分解”回答,我理解了一个小时前我没有理解的东西。再一次,通过你的“分解”回答,我理解了一个小时前我没有理解的东西。
XMainViewModel : MainViewModel<X, XView, XDAO>
List<Giraffe> giraffes = new List<Giraffe>();
giraffes.Add(new Giraffe());
List<Animal> animals = (List<Animal>)giraffes; // This is illegal. What if it were legal?
animals.Add(new Tiger());
Giraffe g = giraffes[1]; // And we just put a Tiger into a variable of type Giraffe.
IEnumerable<Animal> animals = giraffes;