【发布时间】:2017-09-10 11:25:39
【问题描述】:
我有这些课程:
public class FilterBackOfficeDiscountFilterType
{
public FilterBackOfficeDiscountFilterType();
public FilterBackOfficeDiscountFilterType(string filterValue = null, string filterType = null);
[JsonProperty(PropertyName = "filterType")]
public string FilterType { get; set; }
[JsonProperty(PropertyName = "filterValue")]
public string FilterValue { get; set; }
}
还有我的:
public abstract class Filter<T>
where T : struct
{
public T Type { get; set; }
public string Value { get; set; }
}
还有:
public class DiscountFilter : Filter<DiscountFilterType>
{
}
我想以显式或隐式方式将DiscountFilter 转换为FilterBackOfficeDiscountFilterType。
所以我添加了运算符方法:
public class DiscountFilter : Filter<DiscountFilterType>
{
public static implicit operator FilterBackOfficeDiscountFilterType(DiscountFilter filter)
=> new FilterBackOfficeDiscountFilterType(filterType: filter.Type.ToString(), filterValue: filter.Value);
}
但它没有编译,因为:
Cannot implicitly convert type 'Filter<DiscountFilterType>' to 'FilterBackOfficeDiscountFilterType'
我该怎么做?
DiscountFilterType 是一个枚举。
而 FilterCreator.Create 是:
public class DiscountFilterCreator : FilterCreator<DiscountFilterType>
{
public override Filter<DiscountFilterType> Create(DiscountFilterType type, string value)
=> new DiscountFilter {Type = type, Value = string.IsNullOrWhiteSpace(value) ? null : value};
}
来源于:
public abstract class FilterCreator<T>
where T : struct
{
public abstract Filter<T> Create(T type, string value);
}
最后一个Filter 是:
public abstract class Filter<T>
where T : struct
{
public T Type { get; set; }
public string Value { get; set; }
}
编辑 要重现问题,您必须这样做
DiscountFilter filter = new DiscountFilterCreator().Create(DiscountFilterType.normal, "wow");
编辑
DiscountFilter x = this.FilterCreator.Create(DiscountFilterType.BrandId, brandId);
FilterBackOfficeDiscountFilterType y = x;
编辑 它有效:
DiscountFilter x = (DiscountFilter)this.FilterCreator.Create(DiscountFilterType.BrandId, brandId);
FilterBackOfficeDiscountFilterType y = x;
但我想这样做:
FilterBackOfficeDiscountFilterType x = this.FilterCreator.Create(DiscountFilterType.BrandId, brandId);
所以我也需要这种隐式转换:
public class DiscountFilter : Filter<DiscountFilterType>
{
public static implicit operator DiscountFilter(Filter<DiscountFilterType> filter)
=> new DiscountFilter {Value = filter.Value};
public static implicit operator FilterBackOfficeDiscountFilterType(DiscountFilter filter)
=> new FilterBackOfficeDiscountFilterType(filterType: filter.Type.ToString(), filterValue: filter.Value);
}
但是不允许从派生类到基类的隐式转换!
DiscountFilter.implicit operator DiscountFilter(Filter<DiscountFilterType>): user-defined conversions to or from a base class are not allowed
【问题讨论】:
-
所有代码都在这里编译(考虑到一些拼写错误和重复的类型定义,但没关系)。
-
你试过把这个操作符移到泛型类吗?
-
不清楚你在问什么,因为你的代码确实编译得很好。
-
@Evk 是的,您可以重现该问题 DiscountFilter filter = new DiscountFilterCreator().Create(DiscountFilterType.normal, "wow")
-
@PatrickHofman 不是代码编译的问题 Nerf 没有提供如何重现问题
标签: c#