我正在尝试为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必须实现INativeObjectFoo没有。如果将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/

10-11 04:43