我正在尝试为 Xamarin 的 iOS 框架创建绑定(bind),但它在某些 NSSet 属性的泛型类型上遇到了困难:
// @interface Foo : NSObject
[BaseType(typeof(NSObject))]
interface Foo
{ ... }
// @interface Bar : NSObject
[BaseType(typeof(NSObject))]
interface Bar
{
// @property (readonly, nonatomic) NSSet<Foo *> * _Nonnull foos;
[Export("foos")]
NSSet<Foo> foos { get; }
}
产生错误
Error CS0311: The type 'Namespace.Foo' cannot be used as type parameter 'TKey' in the generic type or method 'NSSet'. There is no implicit reference conversion from 'Namespace.Foo' to 'ObjCRuntime.INativeObject'.
我不明白错误是因为Foo 类是基于NSObject的,为什么会产生这个错误?
Best Answer-推荐答案 strong>
Foundation.NSSet<TKey> Class 声明为
[Foundation.Register("NSSet", SkipRegistration=true)]
public sealed class NSSet<TKey> : NSSet, IEnumerable<TKey>
where TKey : class, INativeObject
即,您的混凝土 TKey 必须实现 INativeObject . Foo 才不是。如果你改变 Foo 到
interface Foo : INativeObject
{ }
...编译器错误消失。
where TKey : class, INativeObject 是 (generic) Type Parameter Constraint .它告诉您 TKey 的类型参数必须是通过 class 的引用类型关键字并且它必须实现接口(interface) INativeObject .
关于c# - 不能在 NSSet<TKey> 中使用类,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/52666538/
|