我正在尝试为Xamarin的iOS框架创建绑定,并且在某些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; }
}
产生错误
错误CS0311:类型'Namespace.Foo'不能用作通用类型或方法'NSSet'中的类型参数'TKey'。没有从'Namespace.Foo'到'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
的type参数必须是通过class
关键字的引用类型,并且它必须实现INativeObject
接口。关于c# - 无法使用NSSet <TKey>中的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52666538/