不能在 NSSet <TKey>中使用类



我正在尝试为 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:类型"命名空间.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是一个(通用(类型参数约束。它告诉您TKey的类型参数必须是通过class关键字的引用类型,并且它必须实现接口INativeObject

NSSet<TKey>

定义为:

public sealed class NSSet<TKey> : NSSet, IEnumerable<TKey>
where TKey : class, INativeObject

回复:https://github.com/xamarin/xamarin-macios/blob/bc492585d137d8c3d3a2ffc827db3cdaae3cc869/src/Foundation/NSSet_1.cs#L37

提供 iOS 本机类型,因为 Foo 不满足泛型约束。

至少您可以使用NSSet<NSObject>或者如果您知道将使用的实际集合类型(或者如果您需要创建帮助程序属性/方法(,请使用您可以NSSet<NSString>的最精细的对象类型,NSSet<CGRect>等......

最新更新