C#类型通用参数确定

时间:2014-11-16 07:07:57

标签: c# .net generics

我遇到自动类型确定问题。我正在尝试为通用 Rtf 样式创建(RtfElement.StyleOfType<,>)创建通用方法。但是这个关键字不被编译器假定为TElement : RtfElement类型。我不知道为什么会发生这种情况,因为TElementRtfElement类型限制。

/// <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
}

1 个答案:

答案 0 :(得分:1)

给出以下代码行

style = RtfStyle<TElement>.Create<TStyle>(this);

您在名为RtfStyle<TElement>的{​​{1}}中使用Create类型调用静态方法会发生什么情况。这意味着该方法的参数必须为TStyle,并且您要发送TElement

由于thisthis且未继承RtfElement,因此您的代码无法编译。