c# - 不能在 NSSet<TKey> 中使用类
<p><p>我正在尝试为 Xamarin 的 iOS 框架创建绑定(bind),但它在某些 NSSet 属性的泛型类型上遇到了困难:</p>
<pre><code>// @interface Foo : NSObject
interface Foo
{ ... }
// @interface Bar : NSObject
interface Bar
{
// @property (readonly, nonatomic) NSSet<Foo *> * _Nonnull foos;
NSSet<Foo> foos { get; }
}
</code></pre>
<p>产生错误</p>
<blockquote>
<p>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'.</p>
</blockquote>
<p>我不明白错误是因为<code>Foo</code>类是基于NSObject的,为什么会产生这个错误?</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p><a href="https://developer.xamarin.com/api/type/Foundation.NSSet%3CTKey%3E/" rel="noreferrer noopener nofollow"> <code>Foundation.NSSet<TKey> Class</code> </a>声明为</p>
<pre><code>
public sealed class NSSet<TKey> : NSSet, IEnumerable<TKey>
where TKey : class, INativeObject
</code></pre>
<p>即,您的混凝土 <code>TKey</code>必须实现 <code>INativeObject</code> . <code>Foo</code>才不是。如果你改变 <code>Foo</code>到</p>
<pre><code>interface Foo : INativeObject
{ }
</code></pre>
<p>...编译器错误消失。</p>
<hr/>
<p> <code>where TKey : class, INativeObject</code>是 <a href="https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters" rel="noreferrer noopener nofollow">(generic) Type Parameter Constraint</a> .它告诉您 <code>TKey</code> 的类型参数必须是通过 <code>class</code> 的引用类型关键字并且它必须实现接口(interface) <code>INativeObject</code> .</p></p>
<p style="font-size: 20px;">关于c# - 不能在 NSSet<TKey> 中使用类,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/52666538/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/52666538/
</a>
</p>
页:
[1]