我在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版本有什么问题?也许我错过了什么,或者这是一个编译错误?