我正在尝试为 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的,为什么会产生这个错误?
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/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |