C ++ / CLI中的通用方法和接口

时间:2017-11-04 17:07:32

标签: c# .net visual-studio generics c++-cli

我在C ++ / CLI中编写Visual Studio扩展。要控制编辑器概述,我需要实现ITaggerProvider接口,这是我尝试这样做的:

private ref class MyTagger : ITagger<IOutliningRegionTag^>
{
public:
    virtual event EventHandler<SnapshotSpanEventArgs^>^ TagsChanged;
    virtual IEnumerable<ITagSpan<IOutliningRegionTag^>^>^ GetTags(NormalizedSnapshotSpanCollection ^spans)
    {
        return nullptr;
    }
};

[Export(ITaggerProvider::typeid)]
[TagType(IOutliningRegionTag::typeid)]
[ContentType("text")]
private ref class OutliningTaggerProvider : ITaggerProvider
{
public:
    generic<typename T> where T : ITag
    virtual ITagger<T>^ CreateTagger(ITextBuffer^ buffer)
    {
        return dynamic_cast<ITagger<T>^>(gcnew MyTagger()); // Error here
    }
};

但是,上面的代码没有编译:

error C3214: 'T': invalid type argument for generic parameter 'T' of generic 'Microsoft::VisualStudio::Text::Tagging::ITagSpan', does not meet constraint 'Microsoft::VisualStudio::Text::Tagging::ITag ^'
note: see reference to class generic instantiation 'Microsoft::VisualStudio::Text::Tagging::ITagger<T>' being compiled

我不是C ++ / CLI专家,但根据我的理解,代码是正确的。

这是编译好的等效C#代码:

internal class MyTagger : ITagger<IOutliningRegionTag>
{
    public event EventHandler<SnapshotSpanEventArgs> TagsChanged;
    public IEnumerable<ITagSpan<IOutliningRegionTag>> GetTags(NormalizedSnapshotSpanCollection spans)
    {
        return null;
    }
}

[Export(typeof(ITaggerProvider))]
[TagType(typeof(IOutliningRegionTag))]
[ContentType("text")]
internal class OutliningTaggerProvider : ITaggerProvider
{
    public ITagger<T> CreateTagger<T>(ITextBuffer buffer) where T : ITag
    {
        return new MyTagger() as ITagger<T>;
    }
}

C ++ / CLI版本有什么问题?也许我错过了什么,或者这是一个编译错误?

0 个答案:

没有答案