我遇到自动类型确定问题。我正在尝试为通用 Rtf 样式创建(RtfElement.StyleOfType<,>
)创建通用方法。但是这个关键字不被编译器假定为TElement : RtfElement
类型。我不知道为什么会发生这种情况,因为TElement
有RtfElement
类型限制。
/// <summary>
/// Abstract Rtf style.
/// </summary>
public abstract class RtfStyle<TElement>
where TElement : RtfElement
{
/// <summary>
/// Creates Rtf style of the given type.
/// </summary>
/// <typeparam name="TStyle">Rtf style type</typeparam>
/// <param name="styleOwner">Style owner</param>
/// <returns>Rtf style</returns>
public static TStyle Create<TStyle>(TElement styleOwner)
where TStyle : RtfStyle<TElement>, new()
{
if (styleOwner == null)
{
throw new ArgumentNullException("styleOwner");
}
return new TStyle
{
StyleOwner = styleOwner
};
}
#region Protected Fields
protected TElement StyleOwner;
#endregion
}
以下代码无法在此行编译:
style = RtfStyle<TElement>.Create<TStyle>(this);
编译器错误:"this is not assignable to parameter type TElement":
/// <summary>
/// Abstract Rtf element.
/// </summary>
public abstract class RtfElement
{
/// <summary>
/// Gets Rtf style of the given type.
/// </summary>
/// <typeparam name="TElement">Rtf element type</typeparam>
/// <typeparam name="TStyle">Rtf style type</typeparam>
/// <returns>Rtf style</returns>
protected TStyle StyleOfType<TElement, TStyle>()
where TElement : RtfElement
where TStyle : RtfStyle<TElement>, new()
{
var style = Style.OfType<TStyle>().FirstOrDefault();
if (style != null)
{
return style;
}
style = RtfStyle<TElement>.Create<TStyle>(this);
Style.Add(style);
return style;
}
#region Protected Fields
protected readonly List<IRtfWritable> Style = new List<IRtfWritable>();
#endregion
}
答案 0 :(得分:1)
给出以下代码行
style = RtfStyle<TElement>.Create<TStyle>(this);
您在名为RtfStyle<TElement>
的{{1}}中使用Create
类型调用静态方法会发生什么情况。这意味着该方法的参数必须为TStyle
,并且您要发送TElement
。
由于this
为this
且未继承RtfElement
,因此您的代码无法编译。