diff --git a/src/csharp/Grpc.Core.Api/CallCredentials.cs b/src/csharp/Grpc.Core.Api/CallCredentials.cs
index 3b150a211c2..47b84e03bfe 100644
--- a/src/csharp/Grpc.Core.Api/CallCredentials.cs
+++ b/src/csharp/Grpc.Core.Api/CallCredentials.cs
@@ -30,7 +30,7 @@ namespace Grpc.Core
public abstract class CallCredentials
{
///
- /// Composes multiple multiple CallCredentials objects into
+ /// Composes multiple CallCredentials objects into
/// a single CallCredentials object.
///
/// credentials to compose
diff --git a/src/csharp/Grpc.Core.Api/CallOptions.cs b/src/csharp/Grpc.Core.Api/CallOptions.cs
index c0b732a1005..5d46851e1d2 100644
--- a/src/csharp/Grpc.Core.Api/CallOptions.cs
+++ b/src/csharp/Grpc.Core.Api/CallOptions.cs
@@ -112,7 +112,7 @@ namespace Grpc.Core
}
///
- /// If true and and channel is in ChannelState.TransientFailure, the call will attempt waiting for the channel to recover
+ /// If true and channel is in ChannelState.TransientFailure, the call will attempt waiting for the channel to recover
/// instead of failing immediately (which is the default "FailFast" semantics).
/// Note: experimental API that can change or be removed without any prior notice.
///
diff --git a/src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs b/src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs
index 056758df8ca..0fbcaeeea54 100644
--- a/src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs
+++ b/src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs
@@ -217,7 +217,7 @@ namespace Grpc.Core.Internal
}
///
- /// On Linux systems, using using dlopen and dlsym results in
+ /// On Linux systems, using dlopen and dlsym results in
/// DllNotFoundException("libdl.so not found") if libc6-dev
/// is not installed. As a workaround, we load symbols for
/// dlopen and dlsym from the current process as on Linux