C# 如果定义了cast操作符,如何将List隐式转换为List?

C# 如果定义了cast操作符,如何将List隐式转换为List?,c#,list,type-conversion,C#,List,Type Conversion,我有一个类型栏,它定义了隐式强制转换操作符: public static implicit operator Bar(Foo foo) { return new Bar(foo.property); } 转换单个对象非常有效,但现在我有了一个列表,我需要一个列表 我发现了以下解决方法: List<Bar> barList = fooList.ConvertAll<Bar>(item => item); 这似乎很管用,但如果我必须在这个显式意义上应用隐式c

我有一个类型栏,它定义了隐式强制转换操作符:

public static implicit operator Bar(Foo foo)
{
    return new Bar(foo.property);
}
转换单个对象非常有效,但现在我有了一个列表,我需要一个列表

我发现了以下解决方法:

List<Bar> barList = fooList.ConvertAll<Bar>(item => item);

这似乎很管用,但如果我必须在这个显式意义上应用隐式cast操作符,这有点违背了隐式cast操作符的意义。有什么方法可以使隐式转换对列表有效吗?

不幸的是,您不能使此强制转换隐式,尽管原因有些出乎意料:当您显式地向泛型方法提供类型参数时,C要求您也提供所有剩余的参数。正是这种要么全有要么全无的方法让你写出了这篇文章

List<Bar> barList = fooList.Select(item => (Bar)item).ToList();
还是这个

List<Bar> barList = fooList.Select<Foo,Bar>(item => item);
但它不允许你写下:

List<Bar> barList = fooList.Select<...,Bar>(item => item);
//                                 ^^^
//                                  |
// Figure this out from the context |
理论上,C可以从项目类型中捕获Foo,但它没有这样做的功能

LINQ的强制转换也不会起作用,因为它将被强制转换的项视为普通对象,从而忽略可能在其上定义的任何转换运算符


由于需要同时指定from和to类型,因此基于泛型的解决方案不会比基于ConvertAll的解决方案更好。

不幸的是,您不能将此强制转换隐式化,尽管原因有些出乎意料:当您显式地为泛型方法提供类型参数时,C还要求您提供所有剩余的参数。正是这种要么全有要么全无的方法让你写出了这篇文章

List<Bar> barList = fooList.Select(item => (Bar)item).ToList();
还是这个

List<Bar> barList = fooList.Select<Foo,Bar>(item => item);
但它不允许你写下:

List<Bar> barList = fooList.Select<...,Bar>(item => item);
//                                 ^^^
//                                  |
// Figure this out from the context |
理论上,C可以从项目类型中捕获Foo,但它没有这样做的功能

LINQ的强制转换也不会起作用,因为它将被强制转换的项视为普通对象,从而忽略可能在其上定义的任何转换运算符


由于需要同时指定from和to类型,因此基于泛型的解决方案不会比基于ConvertAll的解决方案更好。

您还没有显示使用列表的代码,这可能会改变所采用的方法。例如如果您通过foreach使用它,则不需要转换列表:@AndyJ我将这些列表作为一个整体传递。您还没有显示使用列表的代码,这可能会改变要采取的方法。例如如果您通过foreach使用它,则不需要转换列表:@AndyJ我将这些列表作为一个整体传递。愚人主义者.OfType.ToList在这里不起作用,还是它在如何进行强制转换方面遇到了相同的问题?@RobV OfType将返回一个空的IEnumerable:它应用与强制转换相同的逻辑,但当无法进行强制转换时,会跳过元素而不是引发异常。DougList.OfType.ToList在此处不起作用,还是与强制转换发生的方式有相同的问题?@RobV OfType将返回一个空的IEnumerable:它应用与强制转换相同的逻辑,但当无法进行强制转换时,将跳过元素而不是引发异常。