xamarin-macios/tests/generator/bug52570classinternal.cs

21 строка
299 B
C#
Исходник Обычный вид История

[generator] Fixes bug 52570 - [generator] warn when [Static] is used in a [Category] (#1862) https://bugzilla.xamarin.com/show_bug.cgi?id=52570 In some cases you will find **static** members inside categories like in the following example: ```objc @interface FooObject (MyFooObjectExtension) + (BOOL)boolMethod:(NSRange *)range; @end ``` This will lead to an **incorrect** Category C# interface definition: ```csharp [Category] [BaseType (typeof (FooObject))] interface FooObject_Extensions { // Incorrect Interface definition [Static] [Export ("boolMethod:")] bool BoolMethod (NSRange range); } ``` This is incorrect because in order to use the `BoolMethod` extension you need an instance of `FooObject` but you are binding an ObjC **static** extension, this is a side effect due to the fact of how C# extension methods are implemented. The only way to use the above definitions is by the following ugly code: ```csharp (null as FooObject).BoolMethod (range); ``` The recommendation to avoid this is to inline the `BoolMethod` definition inside the `FooObject` interface definition itself, this will allow you to call this extension like it is intended `FooObject.BoolMethod (range)`. ```csharp [BaseType (typeof (NSObject))] interface FooObject { [Static] [Export ("boolMethod:")] bool BoolMethod (NSRange range); } ``` We will issue a warning (BI1117) whenever we find a `[Static]` member inside a `[Category]` definition. If you really want to have `[Static]` members inside your `[Category]` definitions you can silence the warning by using `[Category (allowStaticMembers: true)]` or by decorating either your member or `[Category]` interface definition with `[Internal]`.
2017-03-14 22:03:13 +03:00
using System;
using Foundation;
namespace Bug52570ClassInternal {
[Category]
[Internal]
[BaseType (typeof (FooObject))]
interface FooObject_Extensions {
[Static]
[Export ("someMethod:")]
bool SomeMethod (NSRange range);
}
[BaseType (typeof (NSObject))]
interface FooObject {
}
}