我希望在函数返回值时自动将其包装在一个泛型容器中(我知道这并不总是理想的,但对于我的情况来说很有意义)。例如,我想编写以下代码:
public static Wrapper<string> Load() {
return "";
}
我可以通过将以下内容添加到我的Wrapper类来实现此功能:
public static implicit operator Wrapper<T>(T val) {
return new Wrapper<T>(val);
}
很不幸,当我尝试转换一个 IEnumerable
时,它失败了。下面是完整的代码(在ideone上查看):
public class Test {
public static void Main() {
string x = "";
Wrapper<string> xx = x;
string[] y = new[] { "" };
Wrapper<string[]> yy = y;
IEnumerable<string> z = new[] { "" };
Wrapper<IEnumerable<string>> zz = z; // (!)
}
}
public sealed class Wrapper<T> {
private readonly object _value;
public Wrapper(T value) {
this._value = value;
}
public static implicit operator Wrapper<T>(T val) { return new Wrapper<T>(val); }
}
我得到的编译错误是:
无法隐式转换类型“System.Collections.Generic.IEnumerable<string>”为“...Wrapper<System.Collections.Generic.IEnumerable<string>>”
发生了什么情况,我该如何修复它?
IEnumerable<string> z = new [] {""};
替换为var z = new [] {""}
即可解决问题。Ideone 示例。 - vendettamitvar
隐式地将类型定义为string[]
而不是IEnumerable<string>
。 - 31eee384Wrapper
上创建一个静态的通用方法来帮助人们避免指定所有泛型。我在我的Maybe类型中做了这件事,所以您可以说var zz = Maybe.From(z);
,例如。 - StriplingWarrior