VBA を使用している場合は、COM 相互運用機能を使用しています。一般に、COM インターフェイスを明示的に定義することをお勧めします。つまり、次の代わりに:
[ComVisible]
public class MyClass
{
...
}
あなたが使用する必要があります:
[ComVisible]
public interface IMyClass
{
...
}
[ComVisible]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : IMyClass
{
...
}
これを行うと、簡単です。IMyClass
インターフェースで null 許容型を回避し、明示的に実装するだけです。たとえば、次のようになります。
[ComVisible]
public interface IMyClass
{
...
public int MyInt {get; }
}
[ComVisible]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : IMyClass
{
...
public int? MyInt {get; }
int IMyClass.MyInt
{
get { return this.MyInt ?? 0; }
}
}
ちなみに、このように明示的なインターフェイス実装を使用するもう 1 つの利点は、COM 相互運用クライアントに伝達する前に例外をログに記録し、例外が COM に伝達されるときに失われる有用なスタック トレース情報を取得できることです。例えば
[ComVisible]
public interface IMyClass
{
...
public void MyMethod();
}
[ComVisible]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : IMyClass
{
...
public void MyMethod()
{
}
void IMyClass.MyMethod()
{
try
{
this.MyMethod();
}
catch(Exception ex)
{
... log exception ex here ...
throw;
}
}
}